목록Computer Science (28)
Kim Jinung
https://dataonair.or.kr/db-tech-reference/d-guide/sql/?pageid=5&mod=list SQL – DATA ON-AIR dataonair.or.kr
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bn15ju/btsiNaYFZzO/M0bhqCHDRw1olhdj8Tsgt1/img.png)
Proxy 프록시 객체는 클라이언트-서버 아키텍처 중간에 껴서 대리자 역할을 한다. 굳이 왜 프록시를 추가하는 걸까? 서버는 언제나 바쁘다. 그런데 요청을 검증하고 캐싱까지 하려면 서버의 리소스가 많이 빡빡해진다. 그렇기에 서버와 클라이언트 사이에 대리자를 두고 일을 분담시킨다. 예를 들어서 클라이언트 요청에 대한 검증만을 전담하는 프록시를 만들면 그것이 API 게이트웨이다. 더 나아가서 만약 서비스 규모가 커져서 서버 인스턴스를 클러스터로 구축하면 프록시가 앞에서 로드 밸런싱을 해줄 수도 있다. 프록시를 추가함으로써 접근 제어와 부가 기능 등을 추가할 수 있는 것이다. Proxy pattern & Decorator pattern 둘다 프록시를 사용해서 구현한다. GOF 디자인 패턴 책에서는 의도에 따라..
Callback pattern Callback은 실행 가능한 코드 조각을 의미한다. 메서드에 콜백을 인자로 넘기면 콜백을 인자로 받는 메서드는 콜백을 원하는 시점에 실행할 수 있다. (주로 비동기 처리를 위한 목적으로 사용하는 개념이라고 한다.) Example public interface Callback { void call(); } public abstract class Task { final void executeWith(Callback callback) { execute(); Optional.ofNullable(callback).ifPresent(Callback::call); } public abstract void execute(); } @Slf4j public final class Simple..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/l8vez/btsiOH2Igol/ecYCPckCjFWMqJd22OQBhk/img.jpg)
Strategy pattern(Policy pattern) 전략 패턴은 인터페이스와 구현체를 사용해서 로직을 유연하게 변경하는 패턴이다. 구현 코드만 보면 DI랑 뭐가 다른거지 싶은데 목적이 다르다. 전략 패턴은 클라이언트가 전략을 사전에 숙지해서 주도권을 쥐고 런타임 시 전략(알고리즘)을 동적으로 변경한다면, DI는 의존성을 외부에서 주입해주는 방식을 통해서 객체간의 결합을 느슨하게 만드는 것이 목적이다. 템플릿 메서드 패턴이 상속을 이용한다면, 전략 패턴은 컴포지션을 이용하는 방식이다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bFMjAb/btsiOJ7anUh/UEyuuhzmtYxWicov9IWtmK/img.jpg)
Template method pattern 위 이미지에서 추상 클래스와 이를 상속하는 서브 클래스가 존재한다. AbstarctClass의 templateMethod 메서드 로직은 primitive1, 2 메서드를 실행하는 것이고, 두 메서드는 모두 추상 메서드다. 그리고 이를 상속하는 서브 클래스에서는 primitive1, 2메서드를 구현했다. 서브 클래스에서 templateMethod 메서드를 실행하면 서브 클래스에서 정의한 primitive1, 2 메서드가 templateMethod 메서드의 로직으로 동작한다. 즉 템플릿 메서드 패턴은 추상 클래스에서 공통 로직을 정의하고 서브 클래스에서 세부사항을 구현하는 패턴이다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b3KXlR/btsiPi2pmSO/IMMEsjNTne2WTXPketCuQk/img.png)
AOP(Aspect-oriented programming) 직역하면 관점 지향 프로그래밍이다. 객체 지향은 객체에게 책임과 역할을 부여하고 객체 간의 협력을 통해 시스템을 구성하는 방법이다. 그렇다면 관점 지향의 관점은 무엇을 의미하는가. 관점 지향 프로그래밍은 Cross-cutting concern을 분리해서 모듈성을 증가시키는 패러다임이다. 여기서 Cross-cutting concern은 직역하면 횡단 관심사인데, 각 컴포넌트의 공통 관심사 라는 표현이 의도에 더 적합한 것 같다. 그렇다면 컴포넌트의 공통 관심사란 무엇인가. 프레젠테이션 레이어, 비지니스 레이어, 데이터 액세스 레이어는 각각 목적에 따른 핵심 기능이 존재한다. 그리고 트랜잭션, 보안, 로깅과 같은 부수적인 기능을 필요로 한다. 여기서..
JPA Cache 1st Cache: 트랜잭션 단위 2nd Cache: 앱 내에서 공유하는 캐시 Why need default constructor? JPA는 동적으로 객체를 생성하기 위해서 자바 리플렉션 기능 등을 사용한다. 이를 위해서 기본으로 제공해주어야 한다. Undirectional Mapping vs Bidirectional Mapping 양방향 매핑은 2개의 단방향 매핑이다. 디비 테이블은 외래키 조인을 통해 양방향 관계가 성립된다. 반면 객체는 단뱡향 2개로 양방향 참조를 구현해주어야 한다. 일반적으로 FK를 가지고 있는 객체가 연관 관계의 주인이 되고, 반대편 객체는 읽기 전용으로만 사용한다. mappedBy 파라미터의 역할이 여기에 해당한다. 즉 JPA는 mappedBy로 지정된 필드는..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/YdDlP/btsf2mfTBHu/ZBKz3JfuSkraoEMonRrLSK/img.png)
Overview DBMS는 통상 다음과 같은 레이어로 구성된다. (DBMS마다 구조가 천차만별이지만, 일반적으로는 다음과 같다.) Transport subsystem: 클라이언트의 요청을 받는다. DB 클러스터 노드 간 통신에도 사용한다. Query Processor: 쿼리를 해석, 분석 검증, 최적화하고 실행 계획을 선택한다. Execution Engine: 선택한 실행 계획을 실행한다. 스토리지 엔진의 인터페이스에 해당한다. Storage Engine: 실질적인 데이터 쓰기, 읽기 작업을 담당하는 컴포넌트다. Transport DBMS는 클라이언트/서버 모델에 기반한다. DB를 사용할 때 특정 주소로 연결을 요청하고, 커넥션 풀에서 커넥션을 받아오고, 해당 커넥션을 이용해서 쿼리를 날리는 과정이 익숙..
Inheritance, Composition 상속(Inheritacne)는 상위 타입과 하위 타입에 강한 결합도를 만든다. 하위 타입이 상위 타입 코드를 모두 알고 있어야하기 때문이다. 반면에 합성(Composition)은 객체 내부 필드에서 객체를 참조하게 만들고, 클래스의 인터페이스에 의존하게 만드는 방식으로 결합도를 낮춘다. 상속은 타입 계층을 반드시 만들어야 하는 경우에 사용한다. 해당 경우가 아니라면 대부분의 케이스에서 합성을 이용하는 것이 더 좋은 선택이다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/svGgY/btsbjiJpwNK/lLf38C5BzyrHcA9j7HkfDk/img.png)
1. JPA(Java Persistence API) JPA는 자바 진영의 표준 ORM 기술이다. 자바 진영이 늘 그렇듯이 그 자체로 구현체를 제공하지 않고 인터페이스를 제공하고 다양한 구현체가 존재한다. 대표적으로 Hibernate가 있다. 2. JPA architecture JPA는 생각보다 아키텍처에 대한 자료를 찾아보기가 힘들다. 클래스 레벨 아키텍처에서 중요한 클래스들은 Persistence, EntityManagerFactory, EntityManager, EntityTransaction, Query가 존재한다. 내부 코드를 뜯어보면 Persistence 클래스가 EntityManagerFactory 객체를 생성하고, EntityManagerFactory 클래스가 EntityManager를 팩토..