전체 글
[Git] Git flow 정리 및 실습
Git flow 개념에 대한 정리는 Vicent Driessen의 글로부터 하게되었다. https://nvie.com/posts/a-successful-git-branching-model/ 들어가기전에 학교에서 프로젝트를 진행할때 git을 교수님이 쓰라고 하셔서 써본 기억이 있다. 평소에 repo를 그냥 code 저장소로 사용하기만 했었기 때문에 협력 툴로써 git은 처음 사용하는 거였다. 대부분의 코딩 팀플이 그러듯 해당 과정에서 branch의 의미는 무색해졌고 결국에는 4명이 모두 main에서 작업하는 경이로운 프로젝트가 되었었다. 당시에 이 글만 읽고 진행했어도 더 좋은 git관리를 했을 텐데 아쉬움이 느껴진다. 탈중앙화와 중앙화를 동시에 프로젝트로 작업하다보면 프로젝트 내에 각자의 역할이 존재한다..
[Spring]JUnit에서 Async메소드의 비정상적인 종료 - 2편
이전 글에서 Async로 정의된 메소드를 실행하는 걸 JUnit으로 테스트 하던 중 비정상적으로 테스트가 빨리 끝나는 것을 확인 할 수 있었다. 이는 멀티쓰레드로 돌고 있는 비동기 메소드들이 프로세스 종료에 따라 Thread interrupt가 걸려서 생기는 문제였었다. 이번 글에서는 해당 문제를 해결하는 과정을 서술해보고자 한다. 문제 해결에 핵심 비동기로 선언된 메소드들이 끝나는 것을 알 수 있어야한다는 것이였다. 따라서 이를 위해 비동기 함수의 반환값을 Future로 처리하였다. Future Future는 Java에서 비동기로 처리된 메소드들에 대하여 미래에 받아올 수 있는 방식을 정의하는 사용된다. 모르겠는거에 최고는 공식 문서나 소스코드를 읽는거라 생각이 든다. 이번에는 소스코드를 까보도록 하겠..
[Database] 데이터 입력과 삭제 그리고 수정
데이터 입력 - INSERT SELECT문을 활용하면 한번에 여러개의 컬럼을 INSERT시킬 수 있다. CREATE TABLE subway_dml_test AS SELECT * FROM subway_statistics WHERE ROWNUM < 1; ALTER TABLE subway_dml_test ADD PRIMARY KEY ( seq_id ); 여기서 AS는 SELECT로 선택된 테이블의 데이터와 컬럼을 복사하는 역할을 한다. 또한 ROWNUM은 SELECT문장에서 반환되는 로우 수를 의미한다. 하지만 AS로 테이블을 만들었을 때는 기본키를 설정할 수 없기 때문에 추후에 ALTER를 사용해서 기본 키를 지정한다. 만약 종합운동장에 승하차한 역만 복사하고 싶다면 어떻게 하면 될까? CREATE TABL..
[Database] 세미조인과 안티조인
세미조인 메인 쿼리에서 사용된 테이블과 서브쿼리 결과를 조인하는 조인을 의미한다. 먼저 세미 조인은 말 그대로 조인과 유사한 연결방법을 의미한다. 위에서 말했다 싶이 세미조인의 조인 대상은 SELECT문으로 추출된 테이블을 의미한다. 예시를 보면 다음과 같다. EXISTS 연산자를 사용한 세미조인 SELECT * FROM dept_master a WHERE EXISTS (SELECT FROM emp_master b WHERE b.age BETWEEN 40 AND 49 AND a.dept_id = b.dept_id ); Exists연산자는 메인쿼리의 테이블 데이터를 기준으로 서브쿼리에서 반환하는 데이터가 존재하면 참을 반환합니다. INNER JOIN vs SEMI JOIN INNER JOIN과 SEMI J..
[Database] 서브 쿼리
서브쿼리란? 기존까지 진행했던 쿼리는 1개였다. 하지만 쿼리 내에 쿼리를 집어넣을 수 있는 경우가 존재하는데 이를 서브 쿼리라고 한다. 서브 쿼리는 메인 쿼리 안에 또 다른 SELECT문장을 말한다. 스칼라 서브쿼리 스칼라 서브쿼리는 메인 쿼리의 SELECT 절에서 컬럼이나 표현식처럼 사용되는 쿼리를 의미합니다. 따라서 해당 쿼리의 결과가 여러개의 컬럼을 반환하거나 그러면 안됩니다. SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, (SELECT b.dept_name FROM dept_master b WHERE a.dept_id = b.dept_id) dept_name FROM emp_master a 서브쿼리는 dept_name이라는 컬럼을 추출한다. ..
[Database] 테이블 간 관계 맺기 - 외부 조인과 카티션 곱
외부 조인은 내부조인과 달리 다른 테이블과 조인을 하되 조인 컬럼이 존재하지 않는 데이터를 포함시켜서 관계를 맺는 것이다. Left Join Oracle SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, b.dept_id, d.dept_name, b.use_yn FROM emp_master a, dept_master b WHERE a.dept_id = b.dept_id (+) ORDER BY a.emp_id; 현재 상황에서 a에 있는 데이터 중에 a.dept_id가 null인 데이터가 있다. 해당 데이터가 dept_master와 관계를 맺기위해서는 a.dept_id가 필수적이다. 하지만 이 부분을 null로 채워서 합치게 되면 외부조인이 완성된다. 따라..
[Database] 테이블 간 관계 맺기 - 내부 조인
RDBMS는 관계형 데이터 베이스를 관리한다. 관계형 데이터 베이스란 테이블 사이에 관계가 있다는 이야기다. 즉, 테이블 사이에 관계가 있다는 건데 이러한 관계를 만드는 방법이 조인이다. 관계를 맺는 다는 거는 아래의 그림으로 나타낼 수 있을 것이다. 우리가 여기서 눈 여겨보야할 점은 부서번호라는 컬럼이다. 사원테이블과 부서 테이블의 연결고리를 담당하는 컬럼이 부서번호 컬럼이다. 여기서 생각해보야할 점은 테이블 간 연결고리 컬럼은 이름과 데이터형이 동일해야한다는 것이다. 내부 조인은 두 테이블의 연결관계 컬럼을 이용해서 공통적인 부분을 추출해낼때 사용한다. Oracle Inner Join SELECT a.emp_id, a.emp_name, a.gender, a.age, a.dept_id, b.dept_i..
[Database] 집합 쿼리
RDBMS는 집합 개념이 적용되어있다. 이러한 집합개념을 쿼리로 만들 수 있는데 그러한 연산자를 집합 연산자라고 부른다. SQL의 집합연산자는 기본적으로 두 개 이상의 독립적인 SELECT 문장을 연결하는 형태이다. 그렇기 때문에 두 SELECT문이 반환하는 결과의 컬럼 수와 데이터 형은 동일해야한다. UNION ALL 두 집합의 모든 원소를 가져오는 집합연산자입니다. Ex) 올바른 집합연산자를 이용한 쿼리 SELECT emp_id, emp_name, gender, age FROM emp03 UNION ALL SELECT emp_id2, emp_name2, gender, age FROM emp08 Ex) 집합연산자를 사용할 때 컬럼 수가 다른 경우 SELECT emp_id, emp_name, gender..