어플리케이션을 개발할 때 중요한 데이터는 대부분 데이터베이스에 보관한다.
외부 라이브러리에서 h2 Driver를 찾아 connection을 가져오는 코드이다. connection의 class를 출력해보면 구현체가 org.h2.jdbc.JdbcConnection 라는 것을 알 수 있다.
Save실행 순서1\. getConnection() : 앞써 작성했던 ConnectionManager가 드라이버를 찾아 커넥션을 가져온다.2\. con.prepareStatement(sql) : DB에 전달할 SQL과 파라미터들을 준비한다.
회원을 저장하고 저장된 회원을 조회하는 로직이다. 회원에는 lombok의 @Data를 사용했다.
커넥션 풀이란 DB 커넥션을 획득할 떄 다음과 같은 과정을 거친다. DriverManger가 DB 드라이버를 조회해 커넥션을 조회한다. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 이 과정에서 3 way handshake 같은 네이트워크 동작이 발생한다.
스프링은 기본 커넥션 풀로 HikariCP를 사용한다.다른 커넥션 풀과 마찬가지로 HikariCP 또한 DataSource 인터페이스를 구현한 구현체인 HikariDataSource를 제공한다.
데이터를 파일에 저장해도 되는데 DB에 저장하는 이유는 트랜잭션이라는 기능 때문이다.
세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 데이터를 수정하게 되면 여러가지 문제가 발생한다.
프레젠테이션 계층UI 관련된 처리 담당웹 요청과 응답사용자의 요청 검증서비스 계층비즈니스 로직데이터 접근 계층실제 DB에 접근하는 코드서비스 계층은 특정 기술에 종속적이지 않은 순수한 자바 코드로 작성해 최대한 변경없이 유지되어야 한다.
스프링에서 코드 중복을 막기위해 템플릿 콜백 패턴을 적용한 TransactionTemplate 을 제공한다.비즈니스 로직이 정상 수행되면 커밋한다.언체크 예외가 발생하면 롤백하고, 체크 예외의 경우는 커밋한다.코
프록시를 사용하면 트랜잭션을 처리하는 객체와 비즈니스 로직을 처리하는 서비스 객체를 명확하게 분리할 수 있다.스프링 AOP를 사용하기 위해선 프록시를 만들 객체가 스프링 빈에 등록이 되야한다.
스프링부트는 이전에 빈으로 등록했던 dataSource, 트랜잭션 매니저를 자동으로 등록해준다. dataSource : HikariDataSource트랜잭션 매니저 : 등록된 라이브러리를 보고 판단JDBC 기술일 경우, DataSourceTransactionManage
회원가입 시 DB에 같이 ID가 있으면 ID 뒤에 숫자를 붙여 새로운 ID를 만들어야 한다.DB에 저장할 때 ID가 이미 DB에 저장되어 있다면 데이터 베이스는 오류 코드를 반환하고, 이 오류코드를 받은 JDBC 드라이버는 SQLException을 던진다.
스프링은 데이터 접근 계층에 대해 수십가지 예외를 정리해서 일관된 예외 계층을 제공한다.각각의 예외는 특정 기술에 종속적이지 않게 설계되어 있다. 따라서 서비스 계층에서도 스프링이 제공하는 예외를 사용하면 된다. (JDBC 기술을 쓰든 JPA 기술을 쓰든 상관 없음)
리포지토리에 Jdbc를 사용하기 위한 코드들이 같은 로직으로 코드가 중복되어 있다.커넥션 조회, 커넥션 동기화PreparedStatement 생성 및 파라미터 바인딩쿼리 실행결과 바인딩예외 발생 시 스프링 예외 변환기 실행리소스 종료\-> 템플릿 콜백 패턴으로 해결Jd