You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
🚨 테스트는 정상적으로 돌아가지만 h2 콘솔로 확인했을 때, 데이터 값이 들어오지 않아 보이지 않음
@Transaction 어노테이션이 기본적으로 rollback이 되기 때문에 그 값을 false로 변경해줘야 함
즉, @Transaction 어노테이선이 있으면 자동으로 rollback 되기 때문에 굳이 지우는 코드를 만들지 않아도 반복적으로 테스트를 실행시킬 수 있게 됨
순수한 단위 테스트가 스프링 통합 테스트보다 빠르기 때문에 단위 테스트가 더 좋다.
스프링 JdbcTemplate
순수 Jdbc와 동일한 환경설정
test/java/hello/hellospring/service/MemberServiceIntegrationTest 파일 생성
package hello.hellospring.repository; import hello.hellospring.domain.Member;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Member save(Member member) {
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");
Map<String, Object> parameters = new HashMap<>();
parameters.put("name", member.getName());
Number key = jdbcInsert.executeAndReturnKey(new
MapSqlParameterSource(parameters));
member.setId(key.longValue());
return member;
}
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
return result.stream().findAny();
}
@Override
public List<Member> findAll() {
return jdbcTemplate.query("select * from member", memberRowMapper());
}
@Override
public Optional<Member> findByName(String name) {
List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
return result.stream().findAny();
}
private RowMapper<Member> memberRowMapper() {
return (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
}; }
}
SpringConfig 파일 코드 수정
@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 JdbcTemplateMemberRepository(dataSource);
}
}
JPA
JPA(Java Persistence API)
JPA를 사용하면 SQL쿼리도 JPA가 자동으로 처리를 해준다. -> 개발 생산성 높임
마치 객체를 메모리에 넣듯이, JPA에 객체를 넣으면 JPA가 중간에서 DB에 SQL을 날리고 데이터 DB를 통해서 가져오고 하는 것은 JPA가 모두 처리를 해준다.
JPA를 사용하면 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.
SpringConfig 설정 변경 (스프링 데이터 JPA 회원 리포지토리를 사용하도록 변경)
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
public SpringConfig(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
return new MemberService(memberRepository);
}
}
이렇게 설정을 변경하면, 스프링 데이터 JPA가 SpringDataJpaMemberRepository를 보고 스프링 빈을 자동으로 만들어서 객체를 생성해서 스프링빈을 올린다.
기본적으로 제공되는 CRUD 관련 메서드
하지만 완전하게 같은 기능만을 사용할 수는 없다. (주문번호로 찾을수도 있고, 유저네임으로도 찾을수도 있고 등등 ...)
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
6_스프링 DB 접근 기술
H2 데이터베이스 설치
h2 데이터베이스 다운로드 후 압축 풀기
권한 주기
chmod 755 h2.sh명령어로 권한 부여실행
./h2.sh실행 명령어경로 이동 후 실행

H2 데이터베이스, URL 변경


test.mv.db 생성 완료

순수 JDBC
순수 JDBC는 가장 오래된 방식으로 실제 데이터베이스에 연동을 하여 데이터를 관리하는 방법이다.
JdbcMemberRepository 파일에서 데이터베이스를 이용하려면 DataSource가 필요하다. 그리고 이 DataSource를 주입받아야한다. (스프링을 통해 주입받게 된다.)
GetConnection을 통해서는 데이터베이스 커넥션을 얻을 수 있다.
🚨 JdbcMemberRepository.java 파일 생성 후 White Label Error 발생
커뮤니티 글을 참고하여 application.properties를 수정했더니 오류가 발생하지 않음
기존
설정 변경 후
개방 폐쇄 원칙 (OCP : Open-Closed Principle)
스프링 통합 테스트
스프링 컨테이너와 DB까지 연결한 통합 테스트 진행
🚨
MemberServiceIntegrationTest.java파일 생성 후에 테스트 돌렸을 때, 테스트는 정상적으로 돌아가지만 경고가 발생함경고와 관련하여 참고한 글
🚨 테스트는 정상적으로 돌아가지만 h2 콘솔로 확인했을 때, 데이터 값이 들어오지 않아 보이지 않음
@Transaction어노테이션이 기본적으로 rollback이 되기 때문에 그 값을 false로 변경해줘야 함@Transaction어노테이선이 있으면 자동으로 rollback 되기 때문에 굳이 지우는 코드를 만들지 않아도 반복적으로 테스트를 실행시킬 수 있게 됨스프링 JdbcTemplate
test/java/hello/hellospring/service/MemberServiceIntegrationTest파일 생성SpringConfig파일 코드 수정JPA
JPA(Java Persistence API)
JPA를 사용하면 SQL쿼리도 JPA가 자동으로 처리를 해준다. -> 개발 생산성 높임
JPA를 사용하면 SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.
build.gradle파일에 JPA, H2 데이터베이스 관련 라이브러리 추가application.properties파일에 JPA 설정 추가show-sql: JPA가 생성하는 SQL을 출력함ddl-auto: JPA는 테이블을 자동으로 생성하는 기능을 제공하는데none을 사용하면 해당 기능을 끈다.스프링 데이터 JPA
스프링부트와 JPA만 사용해도 개발 생산성이 많이 증가하고 코드가 줄어들게 된다.
하지만, 스프링 데이터 JPA까지 사용한다면 Repository에 구현 클래스 없이 인터페이스만으로도 개발을 완료할 수 있다.
기본 CRUD 기능도 스프링 데이터 JPA가 모두 기본적으로 제공한다.
SpringDataJpaMemberRepository파일 생성 (스프링 데이터 JPA 회원 리포지토리)SpringConfig설정 변경 (스프링 데이터 JPA 회원 리포지토리를 사용하도록 변경)이렇게 설정을 변경하면, 스프링 데이터 JPA가 SpringDataJpaMemberRepository를 보고 스프링 빈을 자동으로 만들어서 객체를 생성해서 스프링빈을 올린다.
SpringDataJpaMemberRepository에서의 처리가 필요하다.Beta Was this translation helpful? Give feedback.
All reactions