데브코스 백엔드 3기 29일차

화수목금!
JDBC, Transaction, AOP 등에 대해 배웠다
그리고 JDBC Template과 DataSource는 많이 낯설었다
기초가 부실했던 나..!


JDBC

dd

사진출처
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)

  1. connection 미리 만들어놓고 pool에 저장
  2. pool에서 connection 가져옴
  3. connection 사용
  4. 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가 해줌


추가방법

  1. compile시점 : AOP를 전용으로 하는 framework(aspectJ)가 소스코드 compile 전 공통구현(부가기능)코드를 소스에 삽입
  2. class loading시점 : class loading 때 byte code에 부가기능 삽입
  3. runtime 시점 : Spring에서 제공하는 AOP 방식 1) proxy이용 : 이미 만들어져 있는 객체의 proxy를 만들어서 proxy객체가 비즈니스로직 호출하면서 부가기능을 앞이나 뒤에 처리


  • Spring AOP가 사용하는 Proxy 2가지
    • JDK dynamic proxy : interface 기반
      • ProxyObject를 별도의 class를 안만들어도 다이나믹하게 만들수 있게 하는거
    • CGLib proxy : class 기반
  • 사용하려면 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 처리해줌
  • Declarative Transaction(선언적 트랜잭션)
    • @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는 분명 공부했었는데 어쩌다가 건너뛰게 된거지? 까먹은걸수도
    암튼 반성과 동시에 이번에 배우게 되어서 좋았다


  • 이번주 게더(오늘의 게더라고 하기엔 차마 양심이 ㅎ 오늘은 일욜 ㅎ)
    • 내 자리를 기깔나게 꾸며보았다 멋져
    • 훈팀 방도 좀 더 꾸며보았다 다들 왜 파티장에서 공부하고 있냐며
    • 소소한 즐거움을 만들어봄 후후 행복..해..!

    1110


업데이트: