--use h2--
이전까지 포스팅까지는 메모리에 저장하여 서버가 내려가면 데이터가 사라졌다.
-> 이것을 방지하기 위해 데이터 베이스 사용
-> 심플한 H2 이용(연습용 DB라고 보면 될 것 같다)
h2설치 후, JDBC URL을 바꿔준다.
jdbc:h2:~/test (기존 설정) 처럼 파일로 접근하는 것이 아닌,
jdbc:h2:tcp://localhost/~/test로 바꿔서 웹소켓으로 디비에 접근
그리고 테이블을 하나 생성해준다.
drop table if exists member CASCADE; // 여기는 지워도 됨
create table member
(
id bigint generated by default as identity,
// bigint = long
// generated by default as identity 이 코드는 id값을 적지 않고 들어와도 db가 자동으로 id를 채워준다
name varchar(255),
primary key (id)
);
멤버 도메인의 private변수와 동일하게 컬럼(column)을 생성해준다!
--JDBC--
JDBC API로 코딩하던 것은 약 20여년 전에 사용하던 방식이라고 한다. 참고만 하자
우선 build.gradle을 수정하자.
첫번째가 jdbc 드라이버, 두번째가 클라이언트
자바는 기본적으로db랑 붙을 때 jdbc 드라이버가 필요하다.
db랑 붙을 때 db가 제공하는 클라이언트가 필요하는데 그것이 바로 아까 설치한 h2database
db랑 붙는다는 말은 곧 db에 접속하기 위한 정보 필요하는 뜻이다.
application.properties에 경로만 입력하고 클래스 이름으로 드라이버를 넣어줘서 생성
->나중에 생성자에 주입받을 수 있음(@autowired를 통해서나 스프링이 설정 파일을 보고 자체적으로 bean 생성)
application.properties에 url과 driver class name 추가
이제 jdbcMemoryRepository class를 작성할 건데, MemberRepository인터페이스 존재하므로 implements로 받자!
public class JdbcMemberRepository implements MemberRepository {
private final DataSource dataSource;
public JdbcMemberRepository(DataSource dataSource) {
this.dataSource = dataSource;
}
}
db접근 변수로는 datasource타입이 필요하다.
(DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다.)
자세한 구현정보는 강의 영상을 참고하길 바란다.
이제 여기서 스프링의 장점 중 하나가 등장한다!
이 구현한 jdbcMemoryRepository class를 configuration 설정에서 MemberRepository의 return 값으로 바꾸어주면 바로 사용가능하다!
=> 즉, 어떤 코드의 변경없이 새로운 클래스를 만들고 인터페이스를 확장받아서 코드한 뒤, configuration만 수정하면 바로 적용 가능하다는 것.
스프링을 사용하는 이유도 동일하다.
바로, 객체지향적 설계가 가능하다는 것! 엄밀히 말하면 다형성을 활용하는 것이다.(= 인터페이스를 두고 구현체를 바꿔끼울 수 있음)
애플리케이션을 조립(어셈블리)하는 코드(앞서 말한 configuration)만 수정 , DI를 활용(bean으로 등록하면 스프링이 알아서 쫙쫙!
굉장히 직관적이고 이해가 잘 되는 그림이다.
※ 개방 - 폐쇄 원칙(OCP,open-closed principle)
-확정에는 열려있고, 수정 변경에는 닫혀있다.
객체지향에서의 다형성의 개념을 잘 활용하면 기능을 완전히 변경해도, 애플리케이션 동작하는 코드들은 변경 안해도 됨! 조립하는 코드만 수정하면 됨.
--스프링 통합 테스트(스프링 + db)--
테스트를 순수 자바코드 말고 스프링과 엮어서 진행하는 것을 말한다.
테스트는 제일 끝 단에 있기 때문에, 제일 편하고 간단하게 진행한다.
테스트 전용 디비도 따로 구축하거나 또는 로컬 pc에 있는 db에서 간단하게 설정한다.
테스트할 클래스에 다음과 같은 어노테이션을 작성한다.
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다. 스프링 실행 -> 테스트 실행 -> 스프링 종료
테스트는 반복할 수 있어야한다. 이미 한번 테스트 해서 임시 db에 값을 넣었는데, 또 시작하면 값이 존재하므로 당연히 에러발생한다.
DB에 insert하면 commit도 해줘야함 (auto commit mode는 자동적으로 commit까지 실행됨)
commit 안하면 db에 저장 되지않는다(=rollback)
@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 transaction 시작하고,
테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다!
순수 자바코드로 하는 테스트(단위테스트라고도 함)는 필요없지않냐 그럼?
-> 훨씬 빠르다. 그리고 순수 단위테스트가 통합테스트보다 양질의 테스트라고 한다. 훈련 필수!
--jdbc template--
스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분
제거해준다. 하지만 SQL은 직접 작성해야 한다. 실무에서도 많이 쓴다.
public class JdbcTemplateMemberRepository implements MemberRepository {
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateMemberRepository(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
}
jdbctemplate 타입이 존재하며, 인젝션으로 datasource를 받는다
Bean으로 등록된 클래스의 유일한 생성자에는 Autowired가 자동으로 붙기 때문에 어노테이션을 굳이 안적어도 좋다!
쿼리문 쓸 때 결과가 나오는 것을 rowmapper로 매핑한다.
sql문에 ?에는 3번째 인자인 name이 들어가고 값을 mapper로 받아와서 result라는 list에 저장한다.
stream().findAny () 메소드를 사용하면 Stream 에서 어떤 요소를 찾을 수 있다 . 순서에 상관없이 요소를 찾을 때 사용한다. 이 메서드는 Stream 이 비어 있는 경우 비어 있는 Optional 인스턴스를 반환합니다. optional 때문에 사용!
@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;
};
}
RowMapper를 사용하면, 원하는 형태의 결과값을 반환할 수 있다.
=> SELECT로 나온 여러개의 값을 반환할 수 있을 뿐만 아니라, 사용자가 원하는 형태로도 얼마든지 받을 수 있다.
= ResultSet에 값을 담아와서 member 객체에 저장한다. 그리고 그것을 rownum만큼 반복한다는 뜻이다.
= SQL 실행 결과로 구한 ResultSet에서 한 행의 데이터를 읽어와 자바 객체로 변환
이름의 유래는 template method pattern이라는 디자인 방법을 선택해서 jdbctemplate이라고 한다.
'스프링(JAVA)' 카테고리의 다른 글
스프링 DB 접근 기술 #3 spring data jpa (0) | 2022.09.25 |
---|---|
스프링 DB 접근 기술 #2 JPA (0) | 2022.09.25 |
Spring 웹mvc 간단 회원 관리 예제(홈 화면, 등록, 조회) (0) | 2022.09.25 |
Spring 스프링 빈과 의존관계 (0) | 2022.09.25 |
Spring 회원 관리 예제 - 테스트 코드 (0) | 2022.09.25 |