DB가 설치되어있을 때 , Database sql가지고 애플리케이션 서버와 db 연결해야하는데, 이 때 필요한 것이 jdbc라는 기술이다.
자바는 기본적으로 DB랑 붙으려면 JDBC 드라이버가 꼭 있어야한다. 이것을 가지고 서로 연동함
DB에 붙으려면 DataSource 라는 것이 필요하다.
DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링 부트는 데이터베이스 커넥션
정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다.
DB 커넥션을 쓰고 나면 외부 네트워크 연결된것이기 때문에, 끊어야한다. 리소스들을 모두 반환해야함
@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지
않는다.
다형성 - 인터페이스를 두고 구현체를 바꿔낄 수 있다.
스프링은 이런 것을 편리하게 되도록 스프링컨테이너가 지원해줌
DI 덕분에 이런 것들이 편리하다.
멤버리포지토리는 구현체로 메모리멤버리포지토리랑, Jdbc멤버메모리리포지토리가 있는데, 스프링 컨테이너에서 설정을
메모리 -> Jdbc 로 바꿔서 등록하면, 나머지 손대지 않아도 된다. 구현체만 바껴서 잘 실행된다
기능을 변경해도, 애플리케이션 전체를 수정할 필요가 없다. 물론 조립하는 코드는 수정해야한다.
그러나 실제 애플리케이션 동작하는 데 필요한 코드들은 수정이나 변경을 하지 않아도 된다.
DB에 데이터를 insert 쿼리한다음에 commit이라는 것을 해줘야 db에 반영이된다. (자동으로 하는 방법과 수동으로 하는 방법이 있다)
다음 테스트를 반복해서 실행하고 싶을 때, @AfterEach 대신
@Transactional을 테스트케이스에 달면 테스트를 실행할 때, @Transactional을 먼저 실행하고, DB에 데이터를 insert 쿼리한 다음에 테스트가 끝나면 롤백을 해줌 그래서, DB에 있는 데이터들이 깔끔하게 반영이 안되고 지워진다.
@Transactional을 넣으면, 테스트 각 메소드 마다 적용 ( 트랜잭션 시작 -> 테스트 실행 -> 롤백)
최소한의 단위로 순수 자바 코드로 하는 테스트를 단위테스트라고한다.
스프링 컨테이너와 DB까지 연동해서 하는 테스트를 통합테스트라고 한다.
가급적이면, 순수한 단위 테스트가 더 좋은 테스트일 확률이 높다
따라서, 단위로 쪼개서 테스트하는 훈련이 필요하고 단위테스트를 잘 만들어야한다.
객체를 메모리에 넣듯이, JPA를 집어넣으면 JPA가 중간에서 DB에 SQL을 날리고 DB에서 데이터를 가지고 오는 것을 처리한다.
단순히 SQL을 날리는 것을 넘어서서, JPA를 사용하면, SQL보다는 객체중심의 설계로 패러다임 전환 가능
따라서 JPA 사용하면 개발 생산성 크게 높일 수 있다.
JPA 라는 것은 자바 표준 인터페이스이다.
그 구현체로 hibernate가 있다. 이것만 주로 사용
JPA는 객체와 orm 기술
orm :
o - object
r - relational
m - mapping (애노테이션 사용)
Identity 전략 : 쿼리에 ID를 넣는 것이 아닌 DB에 값을 넣으면 DB가 id를 자동으로 생성해주는 전략
data jpa 라이브러리를 받으면 스프링 부트가 자동으로 entity manager를 자동으로 생성한다.
만들어진 이 Entity manager를 injection 받으면 된다.
내부적으로 DataSource를 들고 있어서 DB랑 통신하는 것을 내부에서 처리한다.
보통 SQL날리면 테이블 대상으로 쿼리를 날리는데, jpl은 Entity 대상으로 쿼리를 날린다. 그럼 이것이 sql로 번역이 된다.
JPA를 쓰려면 항상 Tranjection(@Transactional)이 있어야한다.
스프링은 해당 클래스의 메서드를 실행할 때 트랜잭션을 시작하고, 메서드가 정상 종료되면 트랜잭션을 커밋한다. 만약 런타임 예외가 발생하면 롤백한다.
JPA를 통한 모든 데이터 저장 및 변경은 트랜잭션 안에서 실행해야 한다.
AOP : 공통관심사항 , 핵심 관심 사항 분리
AOP는 @Aspect를 적어주어야한다.
@Around : 어디다 적용할지 타겟팅
AOP 적용후 의존관계
-> aop가 있으면 가짜 서비스(프록시)를 만들어내서 스프링 빈에 등록할 때
가짜 스프링 빈을 앞에 세워놓고, 가짜 스프링 빈이 끝나면, 내부적으로 이것 저것 타서
그 때 진짜 서비스를 호출한다.
따라서 컨트롤러가 호출하는 것은 진짜 멤버 서비스가 아니라, 프록시라는 기술로 발생하는
가짜 멤버 서비스이다.
프록시를 통해 AOP가 실행이되고, joinPoint.proceed() 하면 그 때 진짜 멤버서비스가 호출