JPA라는 기술을 쓰면 객체를 쿼리없이 바로 디비에 저장하고 관리할수 있다.
JAVA는 db랑 붙으려면 기본적으로 jdbc드라이버가 있어야한다.
db에 붙으려면 dataSouce가 필요하다.
구식이고 복잡하므고 그냥 이런게 있구나 하고 아는정도로 넘어가자.
테스트코드는 필드기반으로 주입받는게 편함 테스트안에서만 쓰기때문에!
@Transactional을 테스트케이스에 달면 테스트 실행할때, Transactional을 먼저 실행하고 db 데이터를 insert하고 query 날리고 테스트가 끝나면 RollBack을 해줘서 디비에 있는 데이터들이 깔끔하게 지워진다. 그래서..
@AfterEach
public void afterEach() {
memberRepository.clearStore();
} 가 필요없다!!
테스트케이스에서만 롤백한다.
순수한 단위테스트가 훨씬 좋은 테스트일 확률이 높다.
가급적이면 단위로 쪼개서 테스트를 하고 스프링 컨테이너 없이 테스트를 하도록 훈련하는것이 좋다.
생성자가 하나만 있고 스프링 Bean으로 등록되어 있으면, @Autowired 생략 가능
//이 부분이 람다로 변경 가능 alt + enter 하면 람다로 변경
return new RowMapper<Member>() {
참고: jdbc 템플릿 메뉴얼 검색해보기
//jdbcTemplate에서 query날리고 그 결과를 memberRowMapper로 매핑해주고
//list로 바꿔서 Optional로 반환
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper());
return result.stream().findAny();
}
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
JPA는 인터페이스만 제공 구현체는 여러개 있는데 그중에 우리는 JPA 인터페이스의 hibernate만 쓴다고 보면 된다. JPA를 쓰려면 entity와 매핑 해야한다.
디비에 값을 넣으면 아이디가 자동으로 생성되는것을 identity전략이라고 한다.
@Entity
public class Member {
//identity전략
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
JPA는 EntityManager로 모든게 동작한다.
inline 단축기: ctrl +alt + n
jpa쿼리언어는 객체를 대상으로 쿼리를 날리고 sql로 번역.
(원래는 테이블을 대상으로 쿼리를 날림)
저장, 조회, 업데이트,딜리트는 sql 짤 필요 없다 자동으로 된다.
인터페이스는 다중상속이 된다.
스프링 데이터 JPA 제공 기능