관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이라는 개념이 없다. 대신에 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속 개념과 가장 유사하다. 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 명세에 명시된..
Spring Cloud OpenFeign이란? Spring Cloud OpenFeign은 선언적 웹서비스 클라이언트이다. RestTemplate과 같이 마이크로서비스 간의 통신에 사용하는 라이브러리이다. Spring Cloud는 Feign에 Spring MVC 애노테이션과 HttpMessageConverter를 지원하고, Eureka, Spring Cloud CircuitBreaker 및 Spring Cloud LoadBalancer를 통합하여 Load-Balanced HTTP 클라이언트를 지원한다. 기존의 RestTemplate은 반복적인 코드가 많고 유지 보수적으로 오래 유지하기 힘든 단점이 있었다. RestTemplate은 다음과 같은 작업들을 반복적으로 수행해야 한다. RestTemplate 인스..
이 글은 우아한 테크 세미나 [테크 리더 3인이 말하는 "개발자 원칙"]의 인프랩 테크리더 이동욱 님의 세미나를 듣고 작성한 글입니다. 일정은 지키지만 버그가 많은 것 vs 일정은 못 지키지만 버그가 없는 것 보통은 이 고민에 대해서 정답을 내리지 못하는 경우가 많다. 프로그래머에게 요구되는 것은 100점이 아닌 80~90점짜리 프로그램을 기한 내에 완성하는 일이다. - 나카지마 사토시 프로덕트의 엔지니어의 일은 고객이 원하는 기능을 고객이 원하는 시점에 전달하는 것이다. 그럼 일정이 퀄리티 보다 중요하다는 걸까? 그건 아니다. 결국 프로덕트 엔지니어가 쌓아야할 역량 중에 가장 중요한 것은 아무리 급해도 항상 80~90점짜리 소프트웨어를 일정 내 개발할 수 있는 방법이다. 일정을 항상 잘 지키는 분들의 ..