본문 바로가기

분류 전체보기382

[querydsl] querydsl에서 projection 다루기 db를 다루다 보면 종종 projection을 다뤄야할 때가 있다. 혹시나 Projection이 무엇인지를 잘 모르는 분들을 위해 간단하게 Projection의 개념에 대해 정리를 해두겠다. Projection 연산 - 한 Relation의 Attribute들의 부분 집합을 구하는 연산자 - 결과로 생성되는 Relation은 스키마에 명시된 Attribute들만 가짐 - 결과 Relation은 기본 키가 아닌 Attribute 에 대해서만 중복된 tuple들이 존재할수 있음 대충 이런건데.. 이를 querydsl에서도 구현할 수 있다. 만약에 Projection의 대상이 하나인 경우에는 그냥 쉽게 아래 예제처럼 하면된다. List result = queryFactory .select(member.user.. 2021. 7. 7.
[querydsl] concat 사용법 (문자열 붙이기) 오늘은 querydsl 을 사용할때 concat 메서드를 이용해서 문자열을 붙이는 방법을 정리해 둘 예정이다. 1. concat concat을 이용해서 문자열을 이어 붙일수도 있다. String 이외의 요소를 이어 붙일 경우에는 해당 요소를 String으로 바꿔주어야 하기에 stringVaule 메서드를 이용해줘야한다. 이 stringValue 메서드는 나중에 enum 타입을 String으로 바꿀때도 유용하니 잘 정리해두고 기억해두면 좋을 것같다. 아래 예시를 보고 각자에 맞게 잘 응용해서 사용하면 될듯하다. String member = queryFactory .select(QMember.member.userName.concat("&").concat(QMember.member.age.stringValue.. 2021. 7. 7.
병합 정렬 (Merge Sort) 알고리즘을 공부하는 학생들이나 취준생들은 이 정렬알고리즘이 꼭 필요할 때가 있다. 많고 많은 정렬 알고리즘 중에 하나를 선택해야한다면 이 병합 정렬을 공부해서 익혀두길 권장한다. 병합 정렬은 안정 정렬에 속하고, 분할 정복(devide & conquer) 알고리즘 중 하나이다. 구현 방법은 아래와 같다. 1. 배열의 길이가 한개가 될때까지 배열을 분할한다. 2. 각 부분의 배열을 재귀적으로 정렬한다. 3. 하나의 리스트가 될때까지 정렬한다. 음 위의 구현방법이 이해가 잘 안되면 아래그림을 보면 이해가 쑤욱 될것이다. 병합정렬의 가장 큰 장점은 입력데이터가 무슨 데이터이든 상관없이 일관되게 O(nlog₂n) 의 복잡도를 가진다는 것이다. 구현 방법은 아래와 같다. public class MergeSort .. 2021. 7. 6.
퀵 소트 (Quick Sort) 오늘은 Quick Sort를 구현해 보려 한다. 퀵 소트는 기준이 되는 값(pivot)을 하나 잡고 , 기준 값 보다 작거나 같은 값을 가지고 있는 자료는 앞쪽으로 보내고, 큰 값을 가지고 있는 자료는 뒤쪽으로 보내 기준 값을 기준으로 분할해서 정렬을 진행하는 방법을 의미한다. 정렬 방식은 아래와 같다. 1. 기준 값(pivot)을 정한다. 2. pivot 앞에는 pivot 보다 작은 값이 오고, pivot 뒤에는 큰값이 오도록 배열을 둘로 분할한다. 3. 분할된 두 개의 배열에 대하여 재귀함수를 통하여 정렬하는 과정을 반복한다. 위처럼 이렇게 정렬이 된다. 시간복잡도는 평균적인 경우에는 O(nlogn) 이지만 최악의 경우는 O(N²) 이다. 최악의 경우는 피봇을 최소값이나 최대값을 선택할때이다. ( 즉.. 2021. 7. 5.
[querydsl] querydsl 에서 서브쿼리 사용하는 법 하이 .. 오늘은 querydsl에서 서브쿼리를 사용하는 방법을 정리해 두려고 한다. 1. where 절 서브 쿼리 1) 기본 사용 법 기본적인 사용 방법을 아래 예제로 만들었다. 여기서 주의해야할 점은 Q 도메인을 서브 쿼리에서 사용할 놈은 따로 만들어 줘야한다는 것이다. 그리고 서브쿼리는 JPAExpressions라는 것을 이용해서 구현할 수 있는데, Q 도메인을 Static 처리한 것 처럼 이것 역시 처리가 가능하다. QMember subMember = new QMember("subMember"); List result = queryFactory .selectFrom(member) .where(member.age.eq( //JPAExpressions. select(subMember.age.min().. 2021. 7. 5.
버블 정렬 (Bubble Sort) 버블 정렬은 인접해 있는 두 배열 요소를 차례대로 검사하여 정렬하는 방식이다. 정렬은 아래와 같이 진행된다. 1. 시작은 배열의 첫번째 요소와 두번째 요소로 시작된다. 인접한 두 요소를 비교하여 정렬한다. 2. 배열의 다음 인접한 요소를 비교하여 정렬한다. (두번째 세번째) 3. 배열의 끝까지 비교를 반복하면 맨끝에는 정렬이 완료된 요소가 온다. 4. 마지막에 정렬된 요소를 제외하고 1~3 과정을 반복한다. 예제 코드 public class BubbleSort { public static void main(String[] args) { int[] data = {3,5,-5,1,4,0}; int[] result = bubbleSort(data); for(int num : result) { System.ou.. 2021. 7. 5.
삽입 정렬 (Insertion Sort) 오늘은 삽입 정렬 정리를 한번 해보겠다. 삽입 정렬은 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교를 해서, 자기 자신의 위치를 찾아 삽입하여 정렬하는 알고리즘이다. 정렬 방식은 아래와 같다. 1. 배열의 첫번째 요소는 정렬된 상태라 가정한다. 2. 배열의 두번째 요소부터 앞에 정렬된 요소들과 차례로 비교하여 교환한다. 3. 최종적으로 해당 요소는 자신의 자리에 맞는 위치에 삽입 된다. 4. 1~3 과정을 반복한다. 삽입 정렬은 데이터가 많아지면 많아질 수록 성능이 저하 된다. 시간 복잡도는 O(N²) 을 따른다. 예제 소스 코드 public class InsertSort { public static void main(String[] args) { int[] data = {3.. 2021. 7. 4.
선택 정렬 ( select sort) 오늘부터 간단하게 정렬 알고리즘을 정리해두려고 한다. 첫번째는 알고리즘 수업을 들을 때 맨 처음 배우는 선택 정렬 알고리즘이다. 이 알고리즘은 아래의 방식을 따라 수행된다. 1. 아직 정렬 안된 리스트 중 가장 앞의 원소를 최소값 or 최댓값으로 설정 2. 가장 앞에 원소를 제외한 나머지 원소를 차례로 비교하여 최솟값 or 최댓값을 찾아감 3. 리스트를 끝까지 비교하여 찾은 최소값을 가장 앞의 원소와 교환 4. 정렬이 다될때까지 1~3 반복 선택 정렬의 경우 데이터를 교환하는 횟수는 적지만 결국 비교하는 횟수가 많아서 대용량 데이터에서는 비효율적이다. 시간 복잡도는 O(N²) 을 따른다. 예제 소스 코드 class SelectSort { public static void main(String[] args.. 2021. 7. 4.
[querydsl] queryDsl 기본 문법 정리 - 조인 ( inner join, theta join , on 절 사용, left outer join, right outer join, fetch join) 오늘은 간단하게 querydsl 에서 여러가지 join을 사용하는 방법을 정리해보고자 한다. 1. join (inner join) 먼저 가장 일반적인 inner join은 아래와 같이 사용하면 된다. 주석의 내용은 참고만 하길 바란다. List result = queryFactory .selectFrom(member) .join(member.team, team) // innerJoin 과 같음 //.rightJoin(member.team, team) // right outer join //.leftJoin(member.team, team) // left outer join .where(team.name.eq("a")) //.on(team.name.eq("a")) // 이것과 where 절은 결과가 같음... 2021. 7. 4.