SQL 8

Spring JPA에서 @Query를 사용하는 방법.

Spirng JPA는 EntityRepository를 이용해 CRUD(생성,조회,수정,삭제)를 쉽게 할 수 있게 지원하지만, 떄떄로 개발을 하다보면 서로 연관관계가 없는 테이블을 조인을 통해 핸들링 해야할일이 꽤나 빈번하게 있다. 위와 같은 상황이 발생할 때 고민해볼만한 방법은 QueryDsl를 이용하거나(이 경우는 DTO가 필요) @Query 어노테션을 이용해 sql문을 작성하는 방법이 있는데, 오늘은 @Query 어노테이션을 이용하는 방법을 아주 간단하게 정리하려고 한다. 딱히 어려운 부분은 없을 것 같아서 코드로 정리하자면 다음과 같다. 12345678910// import 생략// QuerydslPredicateExecutor은 QueryDsl을 사용하기 위해 상속해 둠public interfac..

SPRING FRAMEWORK 2020.09.22

컬럼의 값이 null경우 치환 하는방법

오늘은 내가 잊어버리지 않도록 간단하게 sql에서 컬럼의 값이 null인 경우 값을 치환하는 방법을 정리하려고 한다. 만약 7월한달의 매출총액을 구하는 쿼리를 작성하려면 다음과 같이 작성하게 될 것이다. select sum(amount) from sales where salesDate between '2020-07-01' and '2020-07-31' group by salesDate; 그런데 여기서 문제가 발생한다, 문제 상황은 7월 10일에 sales라는 테이블에 부가세(tax)라는 컬럼이 추가 되게 되었고 그 컬럼의 기본값은 0이 아닌 null로 설정이 되있다. 그리고 이제부터는 부가세가 포함된 금액을 쿼리로 작성해야 한다면 다음과 같이 작성하게 된다. select sum(amount + tax) ..

SQL 2020.07.24

JPA annotation @DynamicUpdate?

오늘은 테이블에 대한 Entity를 만들 떄 항상 선언해 주었던 @DynamicUpdate에 대해서 정리해본다. 기본적으로 @DynamicUpdate는 Spring JPA에서 제공하는 기능이다. (JPA, Hibernate, Spring JPA가 같은 의미는 아님) 개발을 하면서 @DynamicUpdate 어노테이션이 무슨역할을 하는지도 모른채 대부분의 Entity에 선언해줬었는데, 최근들어 왜 선언해야하는지 궁금증이 생겨서 조금 조사해봤다, 간단하게 정리하면 다음과 같다. JPA는 서버가 실행될 때 CURD에 관한 SQL문을 캐싱해놓는데, 여기서 UPDATE문에 UPDATE 대상이 모든 열로 선언되어 있다는 거다, 컬럼(필드)가 20개라면 20개 컬럼에 대한 업데이트문이 선언되어 있는 것이다. (upd..

SPRING FRAMEWORK 2020.05.07

Sql 집계함수(SUM, AVG, MAX, MIN, COUNT)

JPA를 이용해 개발하다보면 몇가지 애로사항이 있는데, 그 중하나가 SQL의 집계함수를 사용할 떄 인 것 같다. 물론 @Formula라는 어노테이션을 이용해 어느정도는 해결할 수는 있다. (@Formula는 나중에 따로 정리 할 예정) 이번 포스팅하는 글에서는 sql 집계함수를 어떻게 사용하는지 간단하게 정리만 해보고자 한다. 먼저 SUM, AVG, MAX, MIN, COUNT 함수들은 엑셀의 함수들과 같은 기능을한다. (합산, 평균, 최대값, 최소값, 개수) 사용방법은 다음과 같이 쿼리문을 작성해주면 된다. 1 2 3 4 -- members 테이블에는 slary라는 급여값을 필드가 존재한다. -- select 함수명(필드) from 테이블명 select sum(slary) '합계', avg(slary)..

SQL 2020.04.21

sql에서 날짜컬럼을 비교하는 방법?

개발을 하다보면 테이블에 날짜데이터를 저장하는 경우가 자주 있는데(아마 대부분의 테이블 설계에서 날짜 데이터는 포함되지 않을까 싶다), 현재 나는 JPA를 이용해 개발을 하고 있기 때문에 쿼리문을 작성하는 경우가 많지는 않은데, 간간히 querydsl을 이용할 때 먼저 쿼리문을 작성하여 작성한 쿼리문을 이용해 코드로 만들고 있는데, 조회조건에 날짜가 들어갈 때 어떻게 비교할 것인가에 대해서 간혹 헷갈리는 경우가 있어 정리해보고자 한다. 일단 대략 member라는 테이블이 존재하고 그 테이블에는 생성일이라는 컬럼이 존재한다고 가정했을 때, member테이블에서 2020년 3월 18일날 생성된 로우를 찾고자 할 때 쿼리문은 다음과 같이 작성하면 된다. 1 2 3 4 5 6 7 8 9 10 -- createD..

SQL 2020.03.18

DML, DDL, DCL 정리

정보처리기사 시험을 준비하면서 외웠던 내용들인데, 자꾸 까먹게 되어서 간단하게 정리를 해보고자 한다. ※ 컬럼(Column)과 필드(Field)는 같은의미로 사용된다. [DML] 먼저 DML(Data Manipulation Language)은 데이터 조작어를 의미한다, DML에 해당하는 명령어는 SELECT(조회), INSERT(삽입), UPDATE(수정), DELETE(삭제)등이있다, 개발필드에서는 CRUD라고도 표현하는 것 같다. DDL의 각 명령어를 작성하는 기본 틀은 다음과 같다. 1 2 3 4 5 6 7 8 9 10 11 12 13 -- select문 SELECT* FROM [table_name]; -- insert문 INSERT INTO [table_name](column_name) VALUE..

DATABASE 2020.03.06

SQL에서 null을 조건으로 주는방법?

개발을 하다보면 쿼리문에 null을 조건으로 사용해야 할 일들이 종종 있다. 사실 컬럼의 값이 null인레코드를 찾는건 매우 간단하다. 먼저 해당컬럼의 값이 null이 아닌 모든 데이터를 가져오고자 한다면, 다음과 같이 사용하면 된다. select * from table where target is not null -> target 컬럼의 값이 null이 아닌 모든 레코드를 조회한다. 반대로 컬럼의 값이 null인 모든 데이터를 가져오려면? select * from table where target is null -> target 컬럼의 값이 null인 모든 레코드를 조회한다. 끝!

SQL 2020.02.12

sql에서의 inner join

개발 진행중 RDB를 사용하고있다면 inner join의 사용빈도가 많은데, 오늘은 inner join을 사용하는 방법에 대해서 제가 아는 만큼 간단히 정리해 보고자 한다. * inner join(내부조인) 이란 ? - 두 테이블간에 공통된 데이터를 이용해 데이터를 조회해오는 방법이라고 생각하면 될거같은데, 정확하게 표현한것인지는 모르겠다. 다른 글들에서는 교집합을 가져온다고 서술되어 있는데, 제 입장에서는 무슨의미인지 잘 와닿지 않는것 같다.. [A테이블] [B테이블] id name age id aid job 1 kim 20 1 1 dev 2 woo 24 2 2 std 위와 같은 테이블이 존재할 때 보통 테이블 설계시 데이터 중복을 최소화 하기 위해 위 예시처럼 설계를 하는 것 같다. 여기서 문제는 a..

SQL 2020.02.04