BooleanBuilder package study.querydsl.dto; import lombok.Data; @Data public class MemberSearchCondition { //회원명, 팀명, 나이(ageGoe, ageLoe) private String username; private String teamName; private Integer ageGoe; private Integer ageLoe; } Request 받을 DTO Wrapper 클래스(Integer)를 사용한 이유는 값이 null일 수도 있기 때문이다. public List searchByBuilder(MemberSearchCondition condition) { BooleanBuilder builder = new Bool..
BooleanBuilder BooleanBuilder는 Predicate를 구현하는 구현체이고 Predicate는 where절의 파라미터 타입입니다. 따라서 BooleanBuilder를 이용해 조건절을 추가한 뒤 where절에 전달하면되고, 이 부분을 동적으로 구현할 수 있습니다. 현재 Entity는 필드 수가 워낙 적어 경우의 수가 몇 가지 나오지 않으니 한 번 모두 테스트해보도록 하겠습니다. @SpringBootTest @Transactional class PlayerTest { @Autowired EntityManager entityManager; private JPAQueryFactory queryFactory; @BeforeEach void setup() { Team tottenhamHotspu..
순수JPA @Test public void findDtoJPQL() throws Exception { List result = em.createQuery("select new study.querydsl.dto.MemberDto(m.username,m.age) from Member m", MemberDto.class) .getResultList(); for (MemberDto memberDto : result) { System.out.println("memberDto = " + memberDto); } } 순수 JPA에서 DTO를 조회할 때는 new 오퍼레이션을 사용해야한다. DTO의 package path를 모두 적어줘야 한다. 생성자 방식만 지원한다. QueryDSL - 프로퍼티 접근 - 필드 접근 ..
이전글인 랜덤매칭 서비스에서 Discord봇을 이용하여 방을 생성하고 Url을 받아온다. https://soobysu.tistory.com/76 MatchingService 매칭 정원이 다 찻을경우 채널을 생성해준다. DiscordService DI Application.yml Application.yml 파일을 셋팅해준후 값을 넣어준다. discord key = 봇id guild id = 디스코드 서버id category = 디스코드 서버 내의 채널 카테고리 id 를 넣어주면 된다 아래의 사진은 디스코드 사용자설정 > 고급 > 개발자 모드를 활성화 해주면 나타난다 settingkey 얻는방법은 밑의 URL참고. https://appmaster.io/ko/blog/discord-bos-saengseong..
조건매칭은 Queue (First in First Out) 구조로 이루어 져야 한다.유저가 접속하면 유저의 매칭취소 / 이탈을 감지 해야 한다.매칭은 게임과 인원수를 알고 있어야 한다. 매칭이 완료되면 Discord url을 각 유저들 에게 뿌린다세션 감지 = Websocket / 대기열 = RedisProblemI/O 접근이 많고 최종으로 매칭이 된 결과만 영구적으로 저장 ( 매칭 실패시 저장 x )사람들을 매칭시켜줄 때마다 매칭할 사람들의 db가 저장 되어있어야 한다. ( 속도와 데이터의 무결성 중요)지속적인 요청에 트래픽에 따라 데이터의 무결성과 속도가 보장 되어야 한다.그에 따라 다른 기능들에 문제가 발생되지 않아야하고, 접근이 많아 기능에 문제가 발생 됐을경우다른 기능에 문제를 일으키면 안..
조건 매칭은 Queue (First in First Out) 구조로 이루어 져야 한다. 유저가 접속하면 유저의 매칭취소 / 이탈을 감지 해야 한다. 매칭은 게임과 인원수를 알고 있어야 한다. 매칭이 완료되면 Discord url을 각 유저들 에게 뿌린다 Controller DeferredResult로 타임아웃 , 캔슬 , 에러 상황을 감지하고 매칭을 캔슬을 해준다 Service key = 게임이름+매칭인원 으로 해주었다. (키는 공유로 사용되어야 하고 벨류는 같은 키값을 바라보고있어야 했기 때문) Lock 걸어 매칭이 완료 되지 않는 유저를 대기 시킨다. DeferredResult 로 비동기 처리를 한 후 대기인원들을 웨이팅 큐에 넣는다. 채팅 요청 (Async : DeferredResult로 응답) 웨..
트랜잭션을 지원하는 쓰기 지연이 가능한 이유begin(); // 트랜잭션 시작save(A);save(B);save(C);commit(); // 트랜잭션 커밋데이터를 저장하는 즉시 등록 쿼리를 데이터베이스에 보낸다. 예제에서 save() 메서드를 호출할 때 마다 즉시 데이터베이스에 등록 쿼리를 보낸다. 그리고 마지막에 트랜잭션을 커밋한다.데이터를 저장하면 등록 쿼리를 데이터베이스에 보내지 않고 메모리에 모아 둔다. 그리고 트랜잭션을 커밋할 때 모아둔 등록 쿼리를 데이터베이스에 보낸다. 트랜잭션을 지원하는 쓰기 지연과 성능 최적화트랜잭션을 지원하는 쓰기 지연과 JDBC 배치insert(member1); // INSERT INTO ...insert(member2); // IN..
Paging / Pagination DB에 저장된 데이터들을 페이지에 맞춰서 몇 개씩 뿌릴건지 알려주는 것 DB에 저장된 데이터가 20개이고 프론트에서 1페이지에 5개씩 이라고 요청하면 백엔드에서 전체 DB에서 데이터를 앞에서부터 5개씩 분류하여 해당 페이지에 맞는 데이터를 넘겨줌. JPA - Pageable 이를 위해서 JPA에서 Pageable이라는 객체를 제공하고있다. Pageable이란?Pageable 이 Pagination 요청 정보를 담기위한 추상 인터페이스 라는 의미/실제로 쓰기 위해서는 구현체가 필요 class QPageRequest : QueryDSL 을 위한 Pageable 구현체 class PageRequest : 가장 기본적인 Pageable 구현체 enum Unpaged : pag..