콘텐츠로 이동

2021 08 23 학습로그 데모데이3

2021-08-23 학습로그 데모데이 3

DB Migration

  • 왜 필요하지? - 데이터베이스의 스키마 변경 사항을 기록하여 버전관리 - DB의 변경이력을 남기면서 안전한 DB 변경 가능 - 기존의 데이터를 날리고 DB 스키마를 바꾸고 백업해 줄 필요가 없어짐
  • 사용법 - 메타데이터 테이블을 만들어 - 버전을 추가하며 DB를 변경해 나감 - 꼬리에 꼬리를 무는 변경

로깅

  • 왜 필요하지? - 디버깅을 하지 못하는 상황에서 로그를 남김 - 웹 기반은 사실 로깅에 의존해야하는 경우 다수 - 서버에 내 프로그램 올려서 디버깅을 할 수 있는 툴이 별로 없어 - 실서버는 로깅 보면서 해결해야 하는 경우가 다수
  • 놀토의 로깅전략 - 로깅 레벨 - FATAL: 매우 심각한 에러, 프로그램 종료되는 경우 - ERROR: 에러가 발생하지만, 프로그램 종료되지 않는 경우 -----------------------의도하지 않은 Exception-----------------------
      - WARN: 에러가 될 수 있는 잠재적 가능성 있는 경우 (ex. 인메모리 캐시 용량 꽉차감, DB 커넥션 예상보다 오래걸림)
      - INFO: 애플리케이션의 상태를 간결하게 보여주는 경우
      - DEBUG: INFO 보다 더 자세한 정보가 필요한 경우
      - TRACE: DEBUG 보다 더 자세한 정보가 필요한 경우, 최종 프로덕션이나 커밋에서 포함하지 말 것
    

    - XML으로 로깅 설정 작성 후 yml에서 spring profile로 추가하여 사용 - profile별 어플리케이션 런타임 로깅 전략 - local: console에 INFO 이상의 로그 - dev: ERROR 레벨 이상의 로그, INFO 레벨 이상의 로그 각각 nolto-error.log, nolto-info.log에 저장 - prod: ERROR 레벨 이상의 로그, INFO 레벨 이상의 로그 각각 nolto-error.log, nolto-info.log에 저장 - dev/prod 환경에서 ERROR 레벨의 로그 찍히면 슬랙에 메시지 전송 - sql 쿼리 로그 찍기 - DB에 보낸 쿼리문을 nolto-sql.log에 저장 - dev 환경에서만 해당 파일 저장

트랜잭션

  • 트랜잭션이란? - 데이터베이스 트랜잭션은 일관성 있고 신뢰할 수 있는 방식으로 독립적이게 처리되는 작업 단위를 뜻한다. - 데이터베이스 트랜잭션은 데이터베이스의 변화를 나타낸다. 데이터베이스 트랜잭션은 크게 두 가지의 목적을 가진다. 1. 예상치 못한 에러가 발생해도 데이터베이스를 신뢰성 있는 상태로 만들 수 있도록 신뢰할 수 있는 작업 단위를 제공한다. 2. 데이터베이스에 동시에 접근하는 경우 프로그램 간에 격리를 제공하여 에러를 방지한다.
  • 트랜잭션의 성질 - 트랜잭션의 성질은 ACID로 대표됨 - [ Atomicity - 원자성 ] - [ Consistency - 일관성 ] - [ Isolation - 독립성 ] - [ Durability - 지속성 ]
  • 스프링에서의 트랜잭션
    - AOP를 활용한 선언적 트랜잭션 @Transactional - 여러가지 옵션을 어노테이션의 속성 값으로 명시함으로써 간편히 사용가능 - 트랜잭션 전파 설정 - REQUIRED, REQUIRES_NEW, MANDATORY, NESTED, NEVER, SUPPORTS, NOT_SUPPORTED - 트랜잭션 고립 수준 - DEFAULT, READ_UNCOMMITED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE

빈 생명주기

  • 빈 생명주기 - 스프링의 컨테이너는 빈 객체의 생성/소멸/주입/제공 등을 담당 - 생명주기는 다음과 같음
    1. 빈 인스턴스화 및 DI - XML/자바 설정 클래스/어노테이션으로 빈 정의 스캔 - 빈 인스턴스 생성 - 빈 프로퍼티에 의존성 주입 2. 빈이 인터페이스 구현시 호출 - 빈이 BeanNameAwate 인터페이스 구현 시 setBeanName() 호출 - 빈이 BeanClassLoaderAware 인터페이스 구현 시 setBeanClassLoader() 호출 - 빈이 ApplicationContextAware 인터페이스 구현시 setApplicationContext() 호출 3. 빈 생성 생명주기 콜백 - @PostConstruct 어노테이션 적용 메서드 호출 - 빈이 InitializingBean 인터페이스 구현 시 afterPropertiesSet() 호출 - 빈이 init-method 정의하면 지정한 메서드 호출 4. 빈 소멸 생성주기 콜백 - @PreDestory 어노테이션 적용 메서드 호출 - 빈이 DisposableBean 인터페이스 구현시 destory() 호출 - 빈이 destory-method 정의하면 지정한 메서드 호출

JPQL

  • 왜 필요하지? - 필요한 정보를 가져오기 위해 .get().get() 을 통해 가져오는 것에 대한 비효율성 - 필요한 데이터를 DB에서 가져오려면 검색 조건을 명시한 SQL 쿼리의 필요성 대두
  • JPQL? - JPA는 SQL을 추상화한 JPQL이란 객체 지향 쿼리 제공 - SQL과 문법이 유사 - JPQL은 엔티티 객체를 대상으로 쿼리를 질의하고, SQL은 데이터베이스 테이블 대상으로 쿼리를 질의 - 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리! - SQL을 추상화했기에 특정 DB 벤더에 의존 X