전체 글(164)
-
QueryDSL을 사용해 통계(Count)쿼리의 결과를 사용해서 정렬하기
도토링 프로젝트를 하다가 QueryDSL을 이용해서 count 쿼리와 이 결과를 바탕으로 정렬하는 데 삽질을 하여서 이를 포스팅하고자 합니다. 요구사항 도토링 프로젝트에서는 회원가입시 멘토와 멘티가 각각 기입했던 희망 멘토링 분야를 토대로 멘티와 멘토를 추천해준다. (회원가입시에 멘토와 멘티 모두 희망 멘토링 분야는 복수 선택이 가능하다.) 이때, 멘토,멘티 정렬 방식은 멘토링 희망 분야가 많이 겹칠 수록 상위에 위치합니다. 만약 겹치는 멘토링 희망 분야의 갯수가 동일할 경우 조회가 더 많이 된 멘토 혹은 멘티가 상위에 위치합니다. 이 포스팅에서 다룰 요구사항은 멘토링 희망 분야가 많이 겹칠수록 상위에 위치한다 입니다! 위 요구사항에서 알 수 있듯이 멘토링 희망 분야가 얼마나 겹치는 지를 알아야합니다. ..
2023.08.15 -
데이터 무결성 지켜야지, 안 지킬거야??
데이터 무결성 데이터의 무결성이란 무엇일까?? 필자가 이해한 바로는 데이터 무결성이란 업무적 무결성 + 데이터베이스에서의 무결성이다. 업무적 무결성이란 애플리케이션 로직 안에서 포함되는 어떠한 제약조건이다. DBMS에서의 무결성이란 데이터베이스에 타입, 관계, 속성등을 정의하여 트랜잭션을 유지시켜주는 최소한의 장치이다. 이번 포스팅에서는 DBMS에서의 무결성에대해서 다뤄보도록 하겠다. 만약, DB에서 데이터 무결성을 설계하지 않을 경우에는 어떠한 일들이 일어날까?? PK를 사용하지 않을 경우 → 테이블에 중복된 데이터 존재 FK를 사용하지 않을 경우 → 부모와 자식 데이터의 논리적인 관계가 깨질 수 있다. 컬럼 제약 조건을 하지 않을 경우 → 기본값, NULL값 등이 비정상적으로 데이터베이스에 존재할 수..
2023.08.07 -
식별자, 비식별자 관계는 뭐고 언제 사용해야하는 걸까??
도토링 프로젝트를 진행하며 여러 아쉬웠던 점이 있었지만, 그 중 순위권 안에 드는 것은 단연코 설계할 시간이 너무나도 부족했던 것이다. 카카오 테크 캠퍼스와 동아리 프로젝트를 같이 병행하다 보니.. ++ 캡스톤까지 다 변명이야 8월 초에는 도토링의 DB 설계부터 단단히 다져볼 생각이다. 두번째 포스팅할 주제는 식별자와 비식별자 관계이다. 식별자 관계와 비식별자 관계가 무엇인 지 알아보기 이전에 이를 모르고 설계를 진행할 경우 아래와 같은 어려움을 맞이할 수 있다. 식별자 관계만을 이용하여 데이터 모델링을 전개할 경우, PK 속성의 숫자가 증가할 수록 관련된 SQL 구문이 복잡해져 개발 오류가 많아지게 된다. 비식별자 관계만을 이용하면 테이블간의 과다한 조인이 유발되 성능 저하가 올 수있다. 성능 저하 절..
2023.08.04 -
엔티티의 통합과 분리의 기준이 뭐야??
도토링 프로젝트를 진행하며 여러 아쉬웠던 점이 있었지만, 그 중 순위권 안에 드는 것은 단연코 설계할 시간이 너무나도 부족했던 것이다. 카카오 테크 캠퍼스와 동아리 프로젝트를 같이 병행하다 보니.. ++ 캡스톤까지 다 변명이야 8월 초에는 도토링의 DB 설계부터 단단히 다져볼 생각이다. 이와 관련하여 처음으로 포스팅할 주제는 엔티티 타입의 통합과 분리이다. 엔티티타입의 통합과 분리는 어떤 기준으로 하는 걸까?? ‘아는 만큼 보이는 데이터베이스의 설계와 구축’이라는 책에서는 아래와 같이 말한다. 엔티티타입의 통합과 분리는 단순하게 엔티티타입의 모습만을 보고 결정하는 것이 아니라 분석의 대상이 되는 업무 패턴을 이해한 후에 업무의 트랜잭션의 패턴을 분석한 후에 엔티티의 통합과 분리를 결정하여라! 도토링 프로..
2023.08.04 -
읽기 전용 쿼리의 성능 최적화에 대한 고민
아래 사진은 저희 도토링 프로젝트의 홈 화면입니다. 이는 멘토가 로그인한다면, 멘토의 직무와 학과를 고려하여 동일한 직무 또는 학과를 가진 멘티님들을 최신순으로 보여주는 화면입니다. 이 화면의 엔티티들은 다른 회원들의 정보들이므로 수정할 필요가 없습니다. 하지만, 홈화면이기 때문에 다시 조회할 일은 꽤나 많을 것으로 판단됩니다. 따라서, 저는 아래와 같은 선택지들을 고민해보았습니다. JPQL을 스칼라 타입으로 조회하기 또는 읽기 전용 쿼리 힌트 사용하기 읽기 전용 트랜잭션 사용 또는 트랜잭션 밖에서 읽기 캐시 적용하기 → 2차 캐시 적용!! 먼저, 위 선택지들의 개념과 특징들을 알아보겠습니다. 스칼라 타입으로 조회 or 읽기 전용 쿼리 힌트 스칼라 타입으로 조회 스칼라 타입은 영속성 컨텍스트가 결과를 관..
2023.07.31 -
private 메서드는 트랜잭션 처리를 할 수 없는 이유
의문 private 메서드는 @Transactional을 적용할 수 없다. 뭔가 예상이 가지만 그래도 한번 알아보자!! 먼저 @Transactional 부터 살펴보자! @Transactional 평소에 저희가 자주 사용하는 @Transactional에는 AOP가 적용되어있습니다. 이를 스프링 트랜잭션 AOP라고 합니다. 스프링 트랜잭션 AOP는 @Transactional이 붙여진 메서드가 실행되기 전에 begin을 호출하고 메서드가 종료한 뒤에 commit을 호출합니다! 어떻게 할 수 있는 걸까요?? 답은 프록시입니다!! Spring에는 두가지 프록시 구현체가 있는 데 Springboot에서는 CGLIb를 사용하기 때문에 CGLIb를 기준으로 설명하겠습니다! 아래는 에코노베이션 동아리에서 진행중인 도토링..
2023.07.26