본문 바로가기

분류 전체보기

QueryDSL - 동적 쿼리 BooleanBuilder @Test public void dynamic1() { List members = searchMember(null, 15); for (Member member1 : members) { System.out.println("member1.getUsername() = " + member1.getUsername()); } } private List searchMember(String username, Integer age){ BooleanBuilder builder = new BooleanBuilder(); if (username != null) builder.and(member.username.eq(username)); if (age != null) builder.and(member.. 더보기
QueryDSL 프로젝션, DTO 사용 프로젝션 특정 필드만 조회할 경우 해당 필드의 타입 리스트가 반환값이 된다. 만약 조회하는 필드가 두개 이상이라면 이렇게 튜플이 된다. 튜플은 쿼리dsl에서 제공해주는 것이다. 그러므로 레포지토리 계층에서만 사용할 수 있도록 해야한다. DTO를 사용한 프로젝션 튜플을 레포지토리 계층에서만 사용하기 위해서는 서비스 계층으로 값을 반환할때 DTO를 사용해야 한다. JPA에서 공부했던 JPQL 쿼리를 DTO로 조회할 때를 잠깐 복습해보면 @Test public void projectionWithDTO() { List resultList = em.createQuery("select new study.QueryDSL.dto.MemberDTO(m.username, m.age) from Member m", Membe.. 더보기
GraphQL로 rest api 감싸기 GraphQL을 사용해서 REST api를 감싸는 것도 가능하다. REST api의 결과 데이터를 GraphQL이 한번 더 핸들링 해주는 것이다. HOW? 방법은 간단하다. 이전 시간에 실습해본 내용은 GraphQL 서버로 데이터를 요청하면 응답값으로 단순히 코드상의 데이터를 전달했다. export let memberList = [ ..멤버 배열 ] export const getMembers = () => memberList; 그렇다면 반환하는 데이터를 fetch나 axios를 사용해서 rest api의 데이터를 가져와 반환하면 된다. 실습해 사용한 무료 rest api 사이트 https://gorest.co.in/ Online REST API for Testing and Prototyping | GO .. 더보기
릿코드 37- Sudoku Solver, nQueen 다시풀기 def dfs(board, empty, count): global isEnd if count == len(empty): for i in board: print(i) isEnd = True return y,x = empty[count] nums = possible(board, y, x) for num in nums: if not isEnd: board[y][x] = num dfs(board, empty, count+1) board[y][x] = 0 def possible(board, y, x): nums = [True for i in range(10)] for i in range(9): nums[board[y][i]] = False nums[board[i][x]] = False y = (y//3) * 3 .. 더보기
nQueen - 백트래킹 def dfs(positions, row) : n = len(positions) if n == row: #끝까지 왔으므로 1 return 1 count = 0 for col in range(n) : positions[row] = col if check(positions, row): count += dfs(positions, row + 1) return count def check(pos, row) : for i in range(row): if pos[i] == pos[row] or (row-i == abs(pos[i] - pos[row])): return False return True def solution(n): ans = [0] * n return dfs(ans, 0) # 1~12까지 for i i.. 더보기
백준 2042 세그먼트 트리 import sys N, M, K = map(int, input().split()) nums = [0] + [int(sys.stdin.readline()) for _ in range(N)] position = [0 for _ in range(N+1)] orders = [list(map(int, sys.stdin.readline().split())) for _ in range(M+K)] arr = [0] * 4 * N def init(start = 1, end = N, index = 1): if start == end : arr[index] = nums[start] position[start] = index return arr[index] mid = (start + end) // 2 arr[index] =.. 더보기
GraphQL이란? REST API와는 다른 GraphQL REST API에서는 url로 요청을 보내서 서버로부터 요청에 맞는 적절한 응답 데이터를 받아온다. 이는 서버가 응답해주기로 정해놓은 틀 내에서 프론트가 데이터를 전달 받을 수 있다는 것이다. 가령 예를 들어 GET /members GET /memos 라는 rest api가 있을때 프론트 측에서 저 url로 요청을 보내면 서버가 정해서 반환해주는 데이터를 받게된다. 받게 되는 데이터가 어떤 구조인지는 console.log에 찍어서 확인해보거나 브라우저를 통해 url로 접속해서 json 데이터를 직접 확인하거나 일 것이다. 반면 GraphQL 에서는 url이 존재하지 않는다. rest api에는 있는 uri 체계도 없고 /members 이런 url도 없고 그저 하나의.. 더보기
쿼리dsl - 조인과 서브쿼리 기본 조인 List team1 = qf.selectFrom(member) .join(member.team, team) .where(team.name.eq("team1")) .fetch(); 기본적인 join 쿼리를 만드는 방법이다. 만약 전혀 연관관계가 없는 경우라면 세타 조인을 쓰면 된다. List fetch = qf.select(member) .from(member, team) .where(member.username.eq(team.name)) .fetch(); 이건 sql 문으로 번역이 되면 from 절에 테이블을 나열한 것으로 번역된다. 세타조인 주의 사항 - 외부 조인 불가능 ON을 활용한 조인 ON을 활용해서 조인하게 되면 Cartesian Product처럼 N*M개의 결과가 나오는 것이 아닌.. 더보기
쿼리 dsl 기초 QType 쿼리dsl 컴파일러가 실행되면 엔티티들을 대상으로 QType 클래스들을 만든다. 쿼리 dsl에서는 이 QType 클래스를 대상으로 쿼리를 만들어낸다. Q클래스 인스턴스의 사용법 2가지 QMember qmem = new Qmember("m"); // 별칭을 주며 직접 생성하기 QMember qmem = QMember.member; 싱글톤으로 구현된 기본 인스턴스 사용하기 1번 방법은 직접 별칭을 주는 것이고 2번의 방법은 기본값을 사용하는 것이다. 해당 QType 인스턴스를 대상으로 쿼리를 생성하면 아래와 같은 쿼리가 생긴다. 위에서 Qtype의 별칭은 sql로 번역이 될때 테이블 별칭을 말한다. 다양한 쿼리 Qtype 인스턴스가 제공해주는 다양한 함수들을 통해 where에 여러 조건을 주는 것.. 더보기
쿼리 dsl 입문 쿼리 dsl 쿼리 dsl은 쿼리를 자바 코드로 작성할 수 있도록 해준다. 이를 통해 아래 두가지 이점을 얻을 수 있다. 1. 컴파일 시점에 문법 에러를 잡아줌 2. 동적 쿼리 문제 해결! 쿼리 dsl은 jpql의 빌더 역할을 한다. 쿼리 dsl 코드는 결국 jpql로 번역된다. 앞서 jqpl에는 몇가지 불편사항, 문제점이 있었다. String name = "james"; em.createQuery("select m from Member m where m.name = :name", Member.class) .setParameter("name",name).getResultList(); 쿼리에 오타가 있을 경우에 잡아내지 못한다. (jpql 처음 사용해서 개발할 때에 이걸로 시간 엄청 까먹었다...) Stri.. 더보기