[spring 입문] 스프링 DB 접근 기술-1
H2 데이터베이스 설치
https://www.h2database.com/html/main.html
에서 다운로드
windows 버전으로 했더니
가 떠서 그냥 all Platform으로 다운로드 함.
압축풀고 h2>bin에 실행파일 찾고 거기서 cmd 띄워서
h2.bat 실행
설정 그대로 두고 Connect 클릭
C드라이브 User 밑에 보면 잘 만들어진 것 확인 가능
이후부터 파일로 접근하면 오류날 수 있어서 (파일 충돌 난다)
JDBC URL: jdbc:h2:tcp://localhost/~/test 로 접근
이렇게 해야 여러 곳에서 접근 가능
- 테이블 생성
drop table if exists member CASCADE;
create table member
(
id bigint generated by default as identity,
name varchar(255),
primary key (id)
);
id 자동으로 채워줌. id가 PK,
ddl sql문은 관리해주는 게 좋다.
hello-spring에 하위 sql 폴더 만들고 ddl.sql 파일 생성해서 저장
h2.bat은 계속 켜둬야함
여기는 웹 콘솔로 들어갔음. 밑에서는 어플리케이션 연동해서
메모리저장 X db에 넣고 빼는 방법 (고전 방식..)
순수 JDBC
build.gradle에 추가
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
resources/application.properties 에 추가
위에 설치관련 에러뜨면 Build.gradle 우측 위에 코끼리 눌러주기
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
repository 폴더 밑에 JdbcMemberRepository.java 클래스 생성
~~코드 귀찮음.. 생략.. ~~
작성 후
SpringConfig를 이렇게 바꿔주면 연결 완료
package hello.hellospring;
import hello.hellospring.repository.JdbcMemberRepository;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
private DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
//return new MemoryMemberRepository();
return new JdbcMemberRepository(dataSource);
}
}
DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체
스프링 부트는 데이터베이스 커넥션정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어서서 DI를 받을 수 있음.
스프링 통합 테스트
이전에 만들어둔 MemberServiceTest를 복사해서 MemberServiceIntegrationTest만들기
@SpringBootTest
@Transactional 붙여주고
@BeformEach지우고 @Autowired로 바꾸기
주의 나는 바보같이 AutoWired MemberRepository가 아니라 MemoryMemberRepository로 해서 계속 에러났는데 주의하기
그리고 hello를 넣는거라서 db에 hello이름있으면 빼주기 (delete from MEMBER;)
테스트는 회원가입하고 rollback해버리기 때문에 반영안되어있음.
db에서 select * from MEMBER; 출력 안나오는게 정상
(기존처럼 지우는 코드 없어도 된다.)
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
@Transactional : 테스트 케이스에 이 어노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고,테스트 완료 후에 항상rollback한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지
않음. (서비스 에서는X, 테스트에서만)
통합 테스트 보다 가급적이면 순수 단위 테스트가 좋은 테스트일 확률 높다. (스프링 컨테이너 없이 하는걸로 훈련)
Author And Source
이 문제에 관하여([spring 입문] 스프링 DB 접근 기술-1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@vector13/spring-입문-스프링-DB-접근-기술저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)