Page History
Info |
---|
RDB를 조작하는 언어인 SQL문을 JPA와 연관하여 SQL문을 함께 정리를하였습니다. 일반적인 SQL문이 JPA에서는 어떻게 표현이 되는지? 샘플화 하였습니다. |
Expand | ||
---|---|---|
| ||
|
SELECT 구문
데이터베이스의 핵심처리는 검색입니다. 저장되어 있는 테이블에서 필요한 데이터를 뽑아내는 것이며
...
Expand | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||||||||||||||||||
주소 테이블 생성Select 구문을 익히기전에 JPA를 통해 테이블을 생성하고 샘플 데이터를 입력하겠습니다. 어플리케이션에서는 데이터모델뿐 아니라 JSON유틸리티/리퀘스트유틸/라우터처리 등 여러가지 성격이 다른 클래스를 다루게 됩니다. 여기서는 data모듈하위에 데이터베이스에 관련된 테이블의 정의를 집합하도록 하겠습니다. JPA-주소테이블
SQL-주소테이블
JPA-주소 데이터 입력
JPA에서는, SQL문을 직접사용하여 Insert를 하지 않습니다. JPA로 작성된 데이터모델에 Insert를 하기위해서는, CrudRepository 인터페이스를 작성후, 배열을 조작하고 관련 함수를 사용하는것만으로 실제 데이터베이스 테이블에 데이터를 추가하는것과 동일한 효과를 낼수 있습니다.
SQL-주소 데이터 입력
SQL-주소 데이터 입력
위와같은 SQL문을 실행하여 실제 데이터베이스에 입력을 하게 됩니다. JPA를 활용하면 Hibernate 기능이 귀찮은 SQL문을 작성해준다라고 보면됩니다. |
...
SQL | JPA | |
---|---|---|
< | WHERE 44 < age | findByAgeGreaterThan(int age); |
<= | WHERE 44 <= age | findByAgeGreaterThanEqual(int age); |
> | WHERE age < 44 | findByAgeLessThan(int age); |
범위 | WHERE age BEETWEEN 10 and 20 | findByAgeBetween(int low,int high); |
부분범위 | WHERE age in ( 34,35,36) | findByAgeIn(int age[]); |
AND | WHERE 40 < age AND sex='남' | findByAgeGreaterThanAndSex(int age,String sex); |
OR | WHERE 40 < age OR sex='여' | findByAgeGreaterThanOrSex(int age,String sex); |
Expand | ||
---|---|---|
| ||
==> JPA 함수쿼리 인터페이스는, 검색 필터/연산을 함수명네이밍 조합으로 할수 있다는게 특이합니다.
처음작성은 어색하지만, 완성이되면 가독성및 사용성이 훨씬더 간편해집니다.
GROUP BY
...
Group By를 이용하면, 데이터를 이쁘게 조각낼수가 있으며
이 조각을 그룹이라고 부릅니다. 이렇게 했을때 이점은
다양한 함수를 이용하여, 그룹별 집계처리가 가능합니다.
집계함수
...
결과값에서 필터걸기
최종 쿼리가 실행된 내용을 가지고, 응용프로그램에서의 필터방법입니다.
1차적인 필터는 DB에서할수도 있지만, 2차 필터를 어플리케이션에서 수행하는 방법입니다.
메모리에서 리스트가 복제됨을 유의하여 사용합니다.
No Format |
---|
List<GoodsData> sList = sPage.getContent().stream()
.filter( p -> p.getSalecnt() >= 0 )
.collect(Collectors.toList()); |
함수쿼리 짧게만들기
Code Block |
---|
public interface AddressRepo extends CrudRepository<Address, Long>{
List<Address> findByAgeGreaterThanAndSex(int age,String sex);
default List<Address> findList(int age,String sex)
{
return findByAgeGreaterThanAndSex(age,sex)
}
} |
함수쿼리는 조건이 많아질수록 길어지는 단점이 있으며, 짧게 사용하고싶으면
위와같이 함수맵핑을 통해 짧게사용가능합니다.
GROUP BY
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Group By를 이용하면, 데이터를 이쁘게 조각낼수가 있으며
이 조각을 그룹이라고 부릅니다. 이렇게 했을때 이점은
다양한 함수를 이용하여, 그룹별 집계처리가 가능합니다.
집계함수
함수 | 용도 | 함수 | 용도 |
---|---|---|---|
AVG | 평균 | MAX | 최대값 |
COUNT | ROW수 | SUM | 합 |
MIN | 최소값 | ||
집계 DTO정의
Address데이터를 가지고 특정집계 수행을 한다고 하면 , ex> 성별에따른 회원수 라고 한다면
Address가
...
집계 DTO정의
Address데이터를 가지고 특정집계 수행을 한다고 하면 , ex> 성별에따른 회원수 라고 한다면
Address가 가진 2차원 테이블의 모습이 바뀌게 됩니다.
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
List<AddressStatistics> addressStaticByRegion = addressRepo.findRegionAvgage(10,49);
// 결과
//대구 51.40
//마산 57.20
//부산 54.13
//서울 66.75
//제주 54.69
//창원 58.12 |
Order BY
지금까지 SELECT구문의 몇가지 예제를 살펴보았습니다. 그런데 그 결과 레코드는 어떠한 순일까요?
그것은 딱히 정해진 규칙없이 DBMS에따라 다르게 작동이됩니다. 어떠한 규칙에(입력순서,빠르게처리되는순서) 의해 작동될수도 있지만
DBMS의 처리순서 규칙을 어렵게 알아내었다고 해도 상황에따라 달라질수도 있기때문에
...
.69
//창원 58.12 |
Order BY
지금까지 SELECT구문의 몇가지 예제를 살펴보았습니다. 그런데 그 결과 레코드는 어떠한 순일까요?
그것은 딱히 정해진 규칙없이 DBMS에따라 다르게 작동이됩니다. 어떠한 규칙에(입력순서,빠르게처리되는순서) 의해 작동될수도 있지만
DBMS의 처리순서 규칙을 어렵게 알아내었다고 해도 상황에따라 달라질수도 있기때문에
순서를 보장받으려면 명시적으로 지정을 하여야 합니다.
Order by을 사용안했을시, 암묵적인 Order처리가 어떻게 되냐? 를 두고 때로 갑론을박이 이루어지기도합니다.
고성능 암묵적인 순서보장을 위해 DBMS의 숨겨진 특성을 이용하고 마치 규칙적인 오더를 발견 할수도 있지만
제공되는 기능은 아닐뿐더러 언제 그 규칙이 깨질지 예측이 불가능하며 동일 DBMS라 할지라도 버젼에따라
그 규칙이 유지되리란 보장이 없는것은 명확한 사실입니다. 이러한 숨겨진 특성을 가지고
DBMS의 성능을 비교한다는것은 소모적인 논쟁이 될가능성이 높습니다.
SQL | JPA |
---|---|
select order by age asc, | public interface AddressRepo extends CrudRepository<Address, Long>{ List<Address> findBySex(String sex, Sort sort); List<Address> findBySexOrderByAgeDesc(String sex); ... 사용예> addressRepo.findBySex("남", new Sort(Sort.Direction.ASC, "age","address") ); – ASC : 오름차순 , DESC : 내림차순 |
...