[mssql] ROW_NUMBER() OVER () , PARTITION BY
2022. 12. 24. 21:52
데이터베이스/mssql
ROW_NUMBER 함수란? - 각 PARTITION 내에서 ORDER BY절에 의해 정렬된 순서를 기준으로 고유한 값을 반환하는 함수입니다. - 윈도우 함수(Window Funtion)로 그룹 내 순위 함수입니다. 문법 ROW_NUMBER() OVER(PARTITION BY [그룹핑할 컬럼] ORDER BY [정렬할 컬럼]) - PARTITION BY는 선택, ORDER BY는 필수 공부하게 된 계기 구조 이번 프로젝트에서 point 라는 도메인에 유저들이 포인트가 지급되면 하나씩 쌓이는 구조이며, totalPoint에 최근에 적립된 totalPoint에서 더해져 DB에 적재가 되는 구조입니다. @Getter @Setter @Entity public class Point extends DateTime ..
[JPA] Pageable과 countQuery 사용한 Spring-Data FETCH JOIN
2022. 11. 24. 13:37
데이터베이스/JPA
시도 아래와 같이 DB에서 페이징으로 정보를 가져와한다 .하지만 N+1 문제가 발생해 @Query 로 쿼리를 직접 적어 fetch join을 시도했다. userRepository.findAll(pageable) 문제발생 Pageable를 사용한 조회시 n+1문제가 발생해 @Query("SELECT S FROM ADMIN S LEFT JOIN FETCH....") 를 사용하여 문제를 해결하려고 했다. 하지만 아래와 같은 에러가 발생. Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was n..
[JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(2)
2022. 8. 4. 21:03
데이터베이스/JPA
지난 번에는 Fetch전략인 LAZY와 EAGER에 대해 알아봤다. 하지만 조회된 테이블의 연관관계 된 테이블까지 써야한다면 @EntityGraph를 사용하는게 좋다. 이 글에서는 @EntityGraph에 대해서 다뤄볼 예정입니다. n+1이 뭔지 Fetch전략에 대해서 잘 모르신다면 아래 링크를 먼저 읽어보는 것도 좋을 것 같습니다. 2022.08.03 - [데이터베이스/JPA] - [JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(1) [JPA] Fetch 전략과 @EntityGraph로 1+n 해결하기(1) JPA를 사용하기전 Mybatis를 사용할 때는 xml로 객체를 SQL에 매핑하는데 시간을 썼지만 JPA는 자동으로 쿼리를 만들어줘서 편하게 사용하고 있었다. 하지만 편한 만큼..
[JPA] Fetch 전략과 @EntityGraph로 n+1 해결하기(1)
2022. 8. 3. 22:12
데이터베이스/JPA
JPA를 사용하기전 Mybatis를 사용할 때는 xml로 객체를 SQL에 매핑하는데 시간을 썼지만 JPA는 자동으로 쿼리를 만들어줘서 편하게 사용하고 있었다. 하지만 편한 만큼이나 나도 모르게 1 + n 쿼리가 실행되고 있었다. 이것만 잘 컨트롤 해줘도 성능이 좋아지고 JPA이해도가 높아지는 것 같다. 이번 글에는 Fetch Join과 Fetch 전략을 사용해서 n+1을 개선할 것이다. n+1 이란? Car 라는 클래스와 그 차의 주인인 Master라는 클래스가 있습니다. 아시다시피 차 주인은 여러 대의 차를 가질 수 있으니 차와 주인의 관계는 N : 1 관계입니다. @Entity public class Master { @Id @GeneratedValue(strategy = GenerationType.I..
레디스(redis)란?
2022. 7. 30. 23:21
데이터베이스/Redis
레디스란? 레디스는 REmote DIctionary Server 의 약자이고, Key Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소이며, 인메모리 상태에서 데이터를 처리함으로써 흔이 사용하는 관계형 데이터베이스(RDS) 그리고 몽고DB로 대표되는 문서형 데이터베이스 보다도 빠르고 가볍게 동작합니다. 레디스는 오픈소스이고, 다양한 서비스에서 레디스를 자유롭게 사용하고 있습니다. 위의 사진에서 볼 수 있듯이 Airbnb, Uber, Instagram도 레디스를 사용하고 있네요. 핑크다이어리, 토스트파일, 두레이 등 사내에서도 많은 팀들이 레디스..
[DB] 예약어란?, 변수명 및 클래스명에 예약어를 쓰지 못하는 이유
2022. 7. 7. 19:48
데이터베이스
글을 쓰게 된 배경 board라는 Entity클래스에 order이라는 변수를 추가했는데 아래와 같이 에러가 발생했다. 알아보니 order은 예약어 이기때문이다. org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL " alter table board add constraint FKqurgsvbj6pv06modyixkngwby foreign key (share_id) references share" via JDBC Statement 그렇다면 예약어란? 각 DB에는 예약어라는 존재한다. 예약어는 그 DB의 문법에 해당되는 단어라고 생각하면된다. 예를 들어보겠습니다. 거의 모든 DB에는 SELECT 라는 예약어를 가지고 있을..
[JPA] JPA로 Pageable사용해서 페이징 처리하기
2022. 6. 29. 11:40
데이터베이스/JPA
목적 HTML단에 페이징처리를 하고싶은데 서버에서 JPA와 Pageable를 이용해 간단하게 데이터를 가공할 수 있다고 해서 정리를 해보았다. Controller Pageable를 파라메타로 선언해준다. @GetMapping("/") public String blogView(Model model, @PageableDefault(size = 6, sort = "createDate", direction = Sort.Direction.DESC) Pageable pageable, @RequestParam(value = "currentPage", defaultValue = "1") int page) { model.addAttribute("pageable", blogRepository.findAll(pageable..
[JPA] JPA 대해서
2022. 6. 29. 11:40
데이터베이스/JPA
ORM이란… ⭐️ ORM은 Object Relational Mapping 의 약어로서, 객체와 DB간의 관계를 매핑해주는 도구입니다. 개발자는 서로를 각각의 특색에 맞게 설계하여 ORM을 통해 추가적인 코드, 설계 없이 각각을 매핑시킬 수 있습니다. ORM 사용을 간단하게 표현한 그림 SQL 쿼리를 사용할 줄 알아도 왜 굳이 ORM 프레임워크를 이용하는 것이 좋은지에 대해 짚고 넘어가야할 것 같습니다. 장점 생산성이 증가합니다. ⭐️ 간단한 SELECT(조회)를 사용하더라도 SQL 쿼리를 프로그래밍 언어에서 사용한다면 자바로는 메소드를 만들어서 쿼리문을 작성하여 그것을 리턴해주고 그것을 SQL 쿼리에서 받아 DB에서 그에 맞는 데이터를 가져오고 그 데이터를 또다시 객체로 매핑하여 받아오는 아주 귀찮은 일..