이 글은 우리FISA 1기 굿프렌즈팀의 기술 블로그에 게시된 글 입니다.
애자일 소프트웨어 개발(Agile software development) 혹은 애자일 개발 프로세스는 소프트웨어 엔지니어링에 대한 개념적인 얼개로, 프로젝트의 생명주기동안 반복적인 개발을 촉진한다. - 위키백과 -
이 글은 우리FISA 1기 굿프렌즈팀의 기술 블로그에 게시된 글 입니다.
이 게시글은 git에 대한 기본적인 명령어 이해를 알고 있다는 전제하에 작성했습니다
git 브랜치의 대표적인 전략은 다음과 같습니다.
우리 팀은 git 브랜치 전략 중 하나인 Git flow 전략을 사용하기로 했습니다. 참고로 “git flow”는 2010년 빈센트 드리슨이 창안했습니다.
하지만 git flow 전략을 모두 가져가진 않고, 그중에서 필요한 부분을 가져가기로 했습니다.
git flow 전략을 들어본 사람은 알겠지만, 배포 주기가 길고 팀의 이력이 있는 경우 적합한 브랜치 전략입니다.
결론적으로 우리 굿프렌즈팀이 Git-flow을 적용한 사진입니다.
해당 부분에 대한 설명을 지금부터 다루도록 하겠습니다.
프로젝트 시작하기에 앞서, 현재 Git Repository 구성부터 살펴보겠습니다.
위 그림은 Git Repository 구성과 워크플로우를 설명하고 있습니다.
이 글은 MySQL 공식문서를 바탕으로 공부하고 정리한 내용입니다.
서비스, 사용자 요구사항의 고도화에 따라서 데이터 규모가 대용량으로 증가되면서, 기존에 사용하던 DB의 용량(storage)과 성능(performance)에 한계가 생기게 된다.
즉, VLDB(Very Large DBMS)와 같이 하나의 DBMS에 너무 큰 table이 들어가면서 용량과 성능 측면에서 많은 이슈가 발생하게 되었고, 이런 이슈를 해결하기 위한 방법으로 테이블을 partition
이라는 몇 개의 단위로 나눠서 관리하는 파티셔닝(Partitioning)
기법을 활용하면 된다.
파티셔닝(Partitioning)
기법을 통해 SW적으로 DB를 분산처리하여 성능이 저하되는 것을 방지하고 관리를 보다 수월하게 할 수 있게 되었다.
파티셔닝(Partitioning)
이란 하나의 테이블을 다수의 테이블로 분할하여 관리하는 것을 의미하며, 프로그래머 입장에서는 여전히 하나의 테이블로 동작하는 것처럼 사용할 수 있다.
즉, 큰 테이블이나 인덱스를, 관리하기 쉬운 파티션이라는 작은 단위로 물리적으로 분할하는 것을 의미한다.
논리적으로는 하나의 테이블처럼, 물리적으로는 여러 개의 테이블로 구성된다.
특정 DML과 Query의 성능을 향상시킨다.
주로 대용량 data wirte 환경에 효율적이다.
특히, full scan에서 데이터 access의 범위를 줄여 성능 향상을 가져온다.
물리적인 파티셔닝으로 인해 전체 데이터의 훼손 가능성이 줄어들고 데이터 가용성이 향상된다.
각 분할 영역(partition 별로)을 독립적으로 백업하고 복구할 수 있다.
table의 partition 단위로 Disk I/O을 분산하여 경합을 줄이기 때문에 update 성능을 향상시킨다.
지정된 범위에 속하는 열 값을 기반으로 파티션에 행을 할당한다.
예를 들어, 우편 번호를 분할 키로 수평 분할하는 경우이다.
값 목록에 파티션을 할당 분할 키 값을 그 목록에 비추어 파티션을 선택한다.
예를 들어, Country 라는 컬럼의 값이 Iceland , Norway , Sweden , Finland , Denmark 중 하나에 있는 행을 빼낼 때 북유럽 국가 파티션을 구축 할 수 있다.
해시 함수의 값에 따라 파티션에 포함할지 여부를 결정한다.
예를 들어, 4개의 파티션으로 분할하는 경우 해시 함수는 0-3의 정수를 돌려준다.
key 파티션은 hash 파티션과 거의 동일하다.
key 파티션은 선정된 파티션 키 값에 대하여 내부적으로 MD5()을 이용하여 해시값을 계산하고, 그 값에 MOD를 적용하여 저장할 파티션을 결정한다.
이 글의 코드와 정보들은 Do it! 자바 완전 정복 책에서 공부하고 정리한 내용을 토대로 작성하였습니다.
LinkedList
가정1
: 7개의 데이터를 가진 ArrayList<E>
객체에서 2번 인덱스에 데이터를 추가하고자 한다.
이 때 기존 2번 이후의 모든 데이터는 한 칸씩 뒤로 밀려나게 되는데, 이는 밀려나는 모든 데이터의 위치 정보를 수정해야 한다는 것을 의미한다.
만일 데이터가 1,000개이고 0번 인덱스에 데이터를 추가하면, 1,000개의 데이터 위치 정보를 모두 수정해야 한다는 것이다.
반면 LikedList<E>
는 각 원소의 앞뒤 객체 정보만을 저장하고 있으므로 어딘가에 값이 추가되면 값이 추가된 위치의 앞뒤 데이터 정보만 수정하면 된다.
따라서 중간에 데이터를 추가할 때 속도 차이가 날 것이라는 점을 예상할 수 있다.
가정2
: 특정 인덱스 위치의 값을 가져오려고 한다.
이런 경우 LinkedList<E>
에서는 각 원소가 자신의 인덱스 정보를 따로 갖고 있지 않다.
반면 ArrayList<E>
는 데이터 자체가 인덱스 번호를 갖고 있으므로 특정 인덱스의 위치를 빠르게 찾을 수 있다.
정리하자면, 데이터의 추가 또는 삭제를 하는 경우는 LinkedList<E>
의 속도가 빠르며, 데이터를 검색하는 경우에는 ArrayList<E>
의 속도가 빠를 것이다.
데이터의 추가, 검색, 삭제를 통해 비교해보면 둘의 차이점을 알 수 있다.
```java package sec01_list.EX06_ArrayListVsLinkedList;
import java.util.ArrayList; import java.util.LinkedList; import java.util.List;
public class ArrayListVsLinkedList { public static void main(String[] args) {
//#1. 데이터 추가시간 비교
List<Integer> aList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
long startTime=0, endTime=0;
//@1-1 ArrayList 데이터 추가시간
startTime = System.nanoTime();
for(int i=0; i<100000; i++) {
aList.add(0, i);
}
endTime = System.nanoTime();
System.out.println("ArrayList 데이터 추가시간 = " +(endTime-startTime) + " ns");
//@1-2 LinkedList 데이터 추가시간
startTime = System.nanoTime();
for(int i=0; i<100000; i++) {
linkedList.add(0, i);
}
endTime = System.nanoTime();
System.out.println("LinkedList 데이터 추가시간 = " +(endTime-startTime) + " ns");