데브코스 백엔드 3기 29일차
화수목금!
JDBC, Transaction, AOP 등에 대해 배웠다
그리고 JDBC Template과 DataSource는 많이 낯설었다
기초가 부실했던 나..!
JDBC
사진출처
http://net-informations.com/java/pr/mysql.htm
- DriverManager로부터 Connection을 받아옴
- Connection으로부터 Statement 만듬
- SQL Exception 발생하면 close statement, clase connection 필수
- Statement 가지고 실행 + Handle warnings
- Update 실행 or ResultSet가져옴
- Statement executeQuery : 수행할 때마다 쿼리문장 분석 - 컴파일 - 실행 3단계 모두 거침
-> SQL injection에 취약 - Prepared Statement : 처음 한번만 3단계를 거친 후 캐시에 담아서 재사용됨
- 컴파일 시 처음에 만들어진 쿼리문이 고정 되어있음
= 미리 statemnent를 만들어 놓으니까 쿼리 중간에 바꾸는게 안됨, dynamic query도 안됨, 성능 더 좋음
- 컴파일 시 처음에 만들어진 쿼리문이 고정 되어있음
javax.sql.DataSource
JDBC에서 DriverManager 외에 DataSource이용해서도 Connection 가져올 수 있음
- DataSource가 데이터베이스와 connection을 관리
-> DB와 connection 하기 위해 스프링에게서 DataSource를 주입받아야 함 - DataSourceUtils를 사용해 Connection 얻음
- 같은 Connection으로 유지하기 위해 DataSourceUtils를 사용
- getConnection()의 인자 값으로 DataSource 넣어줌
- DataSource 이용해서 connection 가져오거나 반납
-> close()할 때 실제로 connection 끊는게 아니라 pool에 반납
DBCP(DataBase Connection Pool)
- connection 미리 만들어놓고 pool에 저장
- pool에서 connection 가져옴
- connection 사용
- connection을 pool에 반환
=> connection 생성, close에 많은 리소스 필요한데 그러한 소비를 막아줌
- spring-boot-starter-jdbc 추가
- HikariCP(DBCP)
- spring-jdbc
JDBC Template
순수 JDBC 사용 시 반복되는 코드(connection 맺고 close하고 resultset에서 내용가져와서 매핑로직 부르고) 줄이기 위해 JDBCTemplate 사용
public class JdbcTemplateVoucherRepository implements VoucherRepository {
private final JdbcTemplate jdbcTemplate;
public JdbcTemplateVoucherRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
- insert : SimpleJdbcInsert(JdbcTemplate) 객체 생성하여 사용
- withTableName()
- usingGeneratedKeyColumns()
- select : JdbcTemplate.query() 사용
- return List type
- RowMapper : ResultSet 결과를 자바 객체로 변환해줌
Embedded DataBase
application에 내장되서 애플리케이션과 함께 시작되고 종료되는 DB 데이터는 메모리 상에 저장
AOP(Aspect-Oriented Programming)
관점(핵심기능) 지향 프로그래밍
- cross cutting concerns : 공통된 부가기능을 별도로 빼서 분리하자
=> 뺀걸 어떻게 추가해?! -> AOP가 해줌
추가방법
- compile시점 : AOP를 전용으로 하는 framework(aspectJ)가 소스코드 compile 전 공통구현(부가기능)코드를 소스에 삽입
- class loading시점 : class loading 때 byte code에 부가기능 삽입
- runtime 시점 : Spring에서 제공하는 AOP 방식 1) proxy이용 : 이미 만들어져 있는 객체의 proxy를 만들어서 proxy객체가 비즈니스로직 호출하면서 부가기능을 앞이나 뒤에 처리
- Spring AOP가 사용하는 Proxy 2가지
- JDK dynamic proxy : interface 기반
- ProxyObject를 별도의 class를 안만들어도 다이나믹하게 만들수 있게 하는거
- CGLib proxy : class 기반
- JDK dynamic proxy : interface 기반
- 사용하려면 spring-boot-starter-aop
- spring-aop
- aspectjweaver
-> xml사용(비추, 오래됨) / @AspectJ annotation
- @AspectJ : Spring이 annotation 읽어서 실제 SpringAOP 방식으로 aspect를 런타임에 적용할 수 있게 해줌
AOP 용어
- Target : AOP를 적용할 대상 = 핵심기능을 담고있는 모듈
- JoinPoint : application이 부가기능(advice)을 적용할 수 있는 지점
= Target 객체가 구현한, interface의 모든 method - Advice : 실제 부가기능을 코드로 작성한
- PointCut : 여러 JoinPoint 중 advice를 어디에 적용할지, 적용할 method를 선별하는 하나의 표현식
=> Target 특정 JoinPoint(PointCutt에 선별된)에 advice 제공
- Aspect = Advice + PointCut
- 하나의 자바클래스, 부가기능들을 모듈화시킨, 여러 method들이 다 부가기능
- Spring에서는 Aspect를 bean으로 등록해서 사용
- @Aspect 이용해서 aspect 적용함
- Weaving : Target의 JoinPoint에 Advice를 적용하는 과정
Transaction
- Programmactic Transaction Management : 프로그램에서 직접 트랜잭션을 관리
- Spring은 PlatformtransactionManager 통해서 Transaction 관리해줌
-> TransactionTemplate : try-catch 안해줘도 예외나면 알아서 rollback 처리해줌
- Spring은 PlatformtransactionManager 통해서 Transaction 관리해줌
- Declarative Transaction(선언적 트랜잭션)
- @Transactional쓰면 proxy에서 자동으로 코드 넣어줌(AOP가 적용된 것)
-> 중복 줄이고 비즈니스 로직에만 집중 가능
- @Transactional쓰면 proxy에서 자동으로 코드 넣어줌(AOP가 적용된 것)
- Transaction proprgation
- Transaction Isolation Level
일기(회고)
- 이번주에 강의가 많고 길었다
강의듣고 바우처 과제하고에 주로 시간을 쏟았다
Voucher class를 interface로 할지 abstract class로 할지 계속 고민했는데
abstract calss가 더 가까운 것 같다는 결론
FixedAmountVoucher와 PercentDiscountVoucher가 Voucher라는 공통의 부모를
가지는게 이질감이 없다 상속의 개념이 더 어울린다 공통된 필드를 가지게 할수 있기도 하고
다음에 Entity 추가되면 해결될 듯한 문제 ㅎㅎ
- 유효성 검사를 입력값을 받는 Console class에서 할지 아니면
입력값으로 인해 만들어지는 객체 안에서 할지 고민되었는데
객체 안에서 하는쪽이 응집성도 높아지고 좋다고 한다
메시지 처리도 마찬가지,
그 클래스에서만 쓴다면 따로 Enum으로 빼지 않고 해당 클래스에서 상수화 해두면 응집성이 높아지니까
- MyBatis는 쓸 줄 아는데 JDBC Template은 처음 보는 내용이라는게
기초가 부실했다는 걸 느꼈다 DataSource도 얕게 알고 있었고
순수 JDBC는 분명 공부했었는데 어쩌다가 건너뛰게 된거지? 까먹은걸수도
암튼 반성과 동시에 이번에 배우게 되어서 좋았다
- 이번주 게더(오늘의 게더라고 하기엔 차마 양심이 ㅎ 오늘은 일욜 ㅎ)
- 내 자리를 기깔나게 꾸며보았다 멋져
- 훈팀 방도 좀 더 꾸며보았다 다들 왜 파티장에서 공부하고 있냐며
- 소소한 즐거움을 만들어봄 후후 행복..해..!