트랜잭션과 격리 수준 트랜잭션은 ACID라 하는 원자성, 일관성, 격리성, 지속성을 보장해야 한다. 원자성(Atomicity) : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공하든가 모두 실패해야 한다. 일관성(Consistency) : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. 격리성(Isolation) : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 격리 수준을 선택할 수 있다. 지속성(Durability) : 트랜잭션을 성공적으로 끝내면 그 결과가 항상 ..
식별관계와 비식별 관계 데이터베이스 테이블 사이에 관계는 외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분된다. 식별 관계 식별 관계는 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래키로 사용하는 관계다. 비식별 관계 비식별 관계는 부모 테이블의 기본 키를 받아서 자식 테이블의 왜래 키로만 사용하는 관계다. 비식별 관계는 외래 키에 NULL을 허용하는지에 따라 필수적 비식별 관계와 선택적 비식별 관계로 나눈다. 필수적 비식별 관계(Mandatory) : 외래 키에 NULL을 허용하지 않는다. 연관관계를 필수적으로 맺어야 한다. 선택적 비식별 관계(Optional) : 외래 키에 NULL을 허용한다. 연관관계를 맺을지 말지 선택할 수 있다. 데이터베이스 테이블..
관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신에 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. ORM에서 이야기하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다. 슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있다. 각각의 테이블로 변환 : 각각을 모두 테이블로 만들고 조회할 때 조인을 사용한다. 통합 테이블로 변환 : 테이블을 하나만 사용해서 통합한다. JPA에서는 단일 테이블 전략이라 한다. 서브타입 테이블로 변환 : 서브 타입마다 하나의 테이블을 만든다. JPA에서는 구현 클래스마다 테이블 전략이라 한다. 조인 전략 조인 전략은 엔티티 각각을..
들어가며 기존에 정리했던 프록시 패턴(https://brightstarit.tistory.com/48)을 통해 기존 코드를 변경하지 않고 핵심 기능과 부가 기능을 나누어서 개발할 수 있었다. 하지만, 프록시 패턴을 사용하면 대상 클래스의 수만큼 프록시 클래스를 만들어야 한다는 단점이 있었다. 클래스를 계속 생성하면 관리 포인트가 늘어나서 유지보수하기 쉽지 않다. 예를 들어 적용 대상이 100개면 프록시 클래스도 100개를 만들어야 되는 것이다. 그런데 프록시 클래스의 기본 코드와 흐름은 거의 같고, 프록시를 어떤 대상에 적용하는가 정도만 차이가 있다. 이 문제를 해결하는 것이 바로 동적 프록시 기술이다. 동적 프록시 기술을 사용하면 개발자가 직접 프록시 클래스를 만들지 않아도 된다. 이름 그대로 프록시 ..
리플렉션(Reflection)이란? 리플렉션(Reflection)은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API이다. 컴파일 시간이 아닌 실행시간에 동적으로 클래스의 정보를 추출할 수 있는 프로그래밍 기법이다. 리플렉션은 동적으로 클래스를 사용해야 할 때 필요하다. 즉, 작성 시점에는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에서 클래스를 가져와서 실행해야 하는 경우 필요하다. 클래스 파일의 위치나 이름만 있다면 해당 클래스의 정보를 얻어내고, 객체를 생성하는 것 또한 가능하게 해주어 유연한 프로그래밍을 가능케 해 준다. 리플렉션은 애플리케이션 개발에서보다는 프레임워크, 라이브러리에서 많이 사용된다.왜냐하면 프레임워크, 라이브..
Kafka Connect란? Kafka는 Producer/Consumer를 통해 데이터 파이프라인을 만들 수 있다. 예를 들어, A서버 DB에 저장한 데이터를 B서버의 DB로도 보낼 수 있다. 이러한 파이프라인이 여러 개면 매번 반복적으로 파이프라인을 구성해줘야 한다. Kafka Connect는 이러한 반복적인 파이프라인 구성을 쉽고 간편하게 만들 수 있도록 만들어진 Apache Kafka 프로젝트 중 하나다. 위 사진을 보면 Kafka Connect를 이용해 왼쪽의 DB데이터를 Source Connector를 이용해 Kafka Broker로 보내고 Sink Connect를 이용해 Kafka에 담긴 데이터를 DB에 저장하는 것을 볼 수 있다. Connect : Connector를 동작하게 하는 프로세서(..
프록시 패턴(Proxy Pattern) 프록시 패턴(Proxy Pattern)은 대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다. 프록시(Proxy)의 사전적인 의미는 '대리인'이라는 뜻이다. 즉, 클라이언트가 대상 객체(Subject)를 직접 사용하는 것이 아니라 대상 객체에 접근하기 전에 프록시 (Proxy) 객체의 메서드를 접근한 후 추가적인 로직을 처리한 뒤 접근하게 된다. 중계 대리자를 사용하는 이유는 여러가지가 있을 수 있는데, 대리자를 사용함으로써 대상 클래스가 부가 기능에 대한 책임을 분리할 수 있고(SRP) 부가 기능의 대한 로직이 바뀌었을 때 원본 객체를 수정할 수 없는 상황일 때를 극복(OCP) 하기 위해서다. 대체적으로 다음과 같은 효과를 누릴..
클래스 로더란? 자바는 컴파일 타임이 아니라 런타임에 클래스 로드하고 링크하는 동적 로드를 하는 특징이 있다. 이 동적 로드를 담당하는 부분이 JVM의 클래스 로더이다. 클래스 로더는 로딩(Loading), 링킹(Linking), 초기화(Initializing) 단계를 거쳐 JVM에서 사용할 수 있게 된다. 로딩(Loading) 자바 바이트 코드(.class)를 메소드 영역에 저장한다. 각 자바 바이트 코드(.class)는 JVM에 의해 메소드 영역에 다음 정보들을 저장한다. 로드된 클래스를 비롯한 그의 부모 클래스의 정보 클래스 파일과 Class, Interface, Enum의 관련 여부 변수나 메소드 등의 정보 링킹(Linking) 검증 : 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된..