[Logging] 로그 출력을 효율적으로 생성 및 추적하기 6편 - Proxy
·
Spring/Logging
Proxy를 사용한 Logging우선 인터페이스 프록시와 상속을 받은 프록시 이렇게 두가지 방법으로 각 레이어에 프록시를 만들어 traceId를 출력하도록 만드는 프록시 객체를 만들어기존의 코드를 수정하지 않고도 프록시 객체가 실제 객체대신 수행되도록 만들 수 있다.하지만 단점으로는 프록시 클래스를 너무 많이 만들어야 한다는 점이다. 또한 프록시 클래스들이 하는일은 로그를 다루는 일인다 그 로직이 모두 똑같다. 그렇다면 굳이 프록시 클래스를 여러개 만들 필요가 없는것이다.이때 사용하는 것이 동적 프록시라는 기술이다.자바가 기본적으로 제공하는 JDK 동적 프록시 기술이나 CGLIB 같은 프록시 생성 오픈소스 기술을 활용하면 프록시 객체를 동적으로 만들어 낼 수 있다.하나의 프록시 객체를 생성하고 이를 동적..
[Logging] 로그 출력을 효율적으로 생성 및 추적하기 5편 - Template Method
·
Spring/Logging
이전 문제점각각의 Controller, Service, Repository에서 주요 비즈니스 로직(CRUD)이 있고, 이 활동을 확인하기 위한 부가 기능인 로깅 출력 기능을 구현했다.부가기능과 핵심 기능이 한 군데 모여 있어 가독성이 떨어지고, 코드가 복잡해지면 유지 보수하기가 어려워진다는 문제점이 발생한다.핵심 기능과 부가 기능을 분리하여 설계하는 것이 디자인적으로 더 좋은 설계라고 할 수 있다.try{ answer = userService.create(name); //핵심 기능 trace.end(status); //부가기능 }catch (Exception e){ trace.exception(status, e); //부가기능 ..
[Logging] 로그 출력을 효율적으로 생성 및 추적하기 4편 ThreadLocal사용기
·
Spring/Logging
V3에서 진행했던 방식의 문제점이였던 동시성을 ThreadLocal을 사용해서 해결해보려 한다.ThreadLocal은 다른 쓰레드와 자원을 공유하지 않는 독립적인 영역이다.그러므로 동시에 수행해도 각자 같은 이름의 변수이지만 다른 객체를 사용하고 있는 것이다.큰 변동사항없이 기존에 사용했던 TraceIdHolder의 타입을 ThreadLocal로 바꿔주고 문법에 맞게 변경해준다.FieldLogTracetraceIdHolder, syncTraceId, begin, releaseTraceId에서 ThreadLocal의 get(),set()메서드를 사용하도록 수정해주면 된다.package com.example.loggingtest.global.trace;import lombok.extern.slf4j.Slf4..
[CS 면접 질문 - DB] 파티셔닝
·
면접 준비/DB
Partitioning테이블은 수직적 또는 수평적으로 분할될 수 있다.수평적 분할은 테이블의 행을 기준으로 테이블을 나누고, 수직적 분할은 테이블의 열을 기준으로 테이블을 나누어 저장한다.정규화된 테이블일지라도 물리적으로 테이블의 열을 분리하여 저장하는 것이 효율적일 때가 있다.테이블에 발생하는 트랜잭션 수에 비해 테이블 내에 열이 과도하게 많거나, 특정 열에 속하는 레코드의 데이터 크기가 다른 열의 레코드에 비해 과도하게 큰 경우, 또는 보안 상의 이유로 특정 열을 별개의 테이블로 나누어 저장해야 하는 경우 수직적 분할이 필요하다.예를 들어 게시글id, title, writer, content가 있는데 content에 과도하게 많은 양의 데이터가 있어 크기가 큰 경우에는 별도의 테이블로 분리한 뒤 필요..
[CS 개념 정리 - DB] 정규화
·
면접 준비/DB
정규화(Normal Form, NF)정규화란 잠재적인 문제가 발생하지 않도록 테이블의 필드를 구성하고, 필요한 경우 테이블을 나누는 작업을 수행한다.정규형의 종류로는 제1 정규형~3정규형, 보이스/코드 정규형, 제4 정규형, 제5 정규형이 있다.대부분의 경우 제3정규형 또는 보이스/코드 정규형까지만 수행된다.제1 정규형모든 속성이 원자 값을 가진다.더 이상 쪼개질 수 없는 값을 필드 데이터로 가져야 한다.하나의 컬럼에 값이 두 개 이상 들어있는 경우 중복되는 레코드를 감수하고 하나의 테이블에서 쪼개는 방법과 여러 개의 테이블로 쪼개는 방법이 있다.제2 정규형제1 정규형을 만족함과 동시에, 기본 키가 아닌 모든 필드들이 모든 기본 키에 완전히 종속되는 조건을 갖춘 상태를 말한다.보통 기본 키가 2개 이상인..
[CS 개념 정리 - DB] 인덱스
·
면접 준비/DB
RDBMS에서 성능을 향상시킬 수 있는 대표적인 방법중에 하나이다.검색 속도 향상을 목적으로 만드는 하나 이상의 테이블 필드에 대한 자료구조이다.MySQL에서는 인덱스를 크게 클러스터형 인덱스와 세컨더리 인덱스(논클러스터형 인덱스)로 나뉜다.클러스터형 인덱스테이블당 하나씩 만들 수 있는 인덱스로, 우리가 사용하는 기본 키를 통해 클러스터형 인덱스가 생성된다.만약 기본 키가 지정된 필드가 없는 경우에는 NOT NULL 제약조건과 UNIQUE 제약 조건이 있는 필드를 클러스터형 인덱스로 간주한다.세컨더리 인덱스(논클러스터형 인덱스)세컨더리 인덱스는 테이블당 여러개가 존재할 수 있으나 클러스터형 인덱스보다 일반적으로 느리다.문법# 테이블 이름의 필드에 세컨더리 인덱스인 인덱스 이름 설정CREATE INDEX ..