안녕하세요. 이번 주제는 postgresql의 upsert를 구현해보는 포스팅입니다. 흔히 jpa를 쓸때 save() 메소드는 없으면 insert, 있으면 update를 한다고 알고 있는데요. JPA는 대략 아래처럼 SimpleJpaRepository에 구현되어 있습니다. @Transactional @Override public S save(S entity) { Assert.notNull(entity, "Entity must not be null."); if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } entity 정보가 isNew에 참이면 persist ..
MSA를 준비하는 도중에 도메인 분리를 해야하는데..! 그러기 위해서는 Dababase에 있는 테이블들부터 우선 구분을 할 필요가 있었다..! 따라서 전체 테이블이 800개가 넘어가는 모놀리틱한 데이터베이스의 전체 테이블을 파일로 저장하기 위해서 아래의 쿼리를 확인해보았더니 SELECT * FROM pg_catalog.pg_tables; 전체 schema의 테이블이 조회되어 시스템 테이블도 함께 조회된다. (pg_catalog) 따라서 where절에 다음과 같은 조건을 붙여 결과를 확인했다. SELECT * FROM pg_catalog.pg_tables where schemaname = 'public'; 그러니 현재 관리하고 있는 모든 데이터베이스 테이블의 목록을 구할 수 있었다!
안녕하세요. 개발하다가 너무 datagrip의 인터페이스로 제공되는 ddl을 많이 사용하는 것 같아서 개인적으로 스키마를 sql only로 처리하려고 노력하고 있는데..(누군가는 필요없다고 생각할 수 있지만 개인적인 챌린지입니다!) mysql보단 postgresql을 많이 사용했다보니 개인 프로젝트 할 때 mysql의 테이블을 수정하거나 컬럼을 수정할 때 자주 찾아보게되는 것보다 제 블로그에 정리해놓는 것이 더 좋을 것 같아서 이를 정리하고자 합니다. 먼저 예제로 사용할 테이블을 만들어 보겠습니다. 테이블 생성 create table room( seq bigint primary key, type varchar(100), status varchar(100) ); 단순한 구조의 예제 테이블을 생성했습니다. ..
예전에 받았던 질문중에서 "MyBatis를 쓰고 실행 계획에 기반한 쿼리 튜닝을 통해서 성능을 많이 향상시킨다고 하셨는데, 랜덤 엑세스에 대해서 아시나요?" 라는 질문이 있었다. 랜덤 엑세스?? 분명 내가 보던 실행 계획에는 그런 워딩은 없었던 것 같다. 단순히 slow를 유발하는 컬럼에 대해 인덱스를 생성하고 해당 컬럼에 대한 쿼리 플랜에 index scan이 일어나는 것을 확인하고 쿼리의 실행 속도정도만 확인했었다. 나는 확실히 where 절에 활용되는 컬럼만을 집중했었다. 랜덤엑세스 랜덤 엑세스란 데이터를 저장하는 블록을 한번에 여러 개 액세스하는 것이 아니라 한 번에 하나의 블록만을 액세스하는 방식이다. 한 번에 여러 개의 블록을 액세스한다면(랜덤 엑세스와 반대) 같은 양의 데이터에 대해 적은 횟..
안녕하세요. 오늘은 exists() 연산자에 대해서 포스팅을 해보고자 합니다. 사실 함수인지 연산자인지 개인적으로 혼란이 오는 부분이 있었지만 알아본 결과.. operator라는 단어로 서술되어있는 documentation이 많이있더라구요. 따라서 이 포스팅 내에서도 연산자로 서술하였습니다. 문법일단은 매개변수를 table 형태의 객체를 받고, bool 타입의 값을 리턴하는 형태의 구조를 띄고 있습니다.EXISTS (subquery)- 서브쿼리라함은 그 자체로 테이블 형태의 결과를 도출하기 때문에 Table 객체 타입으로 봐도 무방할 것 같습니다. exists 연산자를 사용할 때에는 이 subquery를 어떻게 간결하게 표현하느냐가 그 성능을 좌우하기도 합니다. 반환 타입bool (true/false) ..
오늘은 Postgresql에서 특정날짜부분을 추출하는 extract() 함수를 소개해보고자 합니다. 이미 이전 포스팅에서 extract() 함수에 대해서 사용법을 설명한 적이 있었는데요!sas-study.tistory.com/387[Postgresql] 날짜시간 추출, EXTRACT() 함수 사용법 정리오늘은 Postgresql에서 특정날짜부분을 추출하는 extract() 함수를 소개해보고자 합니다. extract() 함수는 날짜/시간 데이터에서 year(년도), month(월), day(일) 과 같은 요소를 추출/검색하는 함수입니다. sas-study.tistory.com거의 유사한 기능을 제공해서 사실 큰 의미는 없지만 편하신 방법 혹은 표현을 사용하시면 좋을 것 같아요! 문법해당 함수는 아래와 같이..
오늘은 Postgresql에서 특정날짜부분을 추출하는 extract() 함수를 소개해보고자 합니다. extract() 함수는 날짜/시간 데이터에서 year(년도), month(월), day(일) 과 같은 요소를 추출/검색하는 함수입니다. 예를 들면, '2021년 01월 01일 14시 23분 55초' 일때, 현재의 year(2021), month(1), day(1) 의 값을 추출할 수 있습니다. 문법해당 함수는 아래와 같이 사용할 수 있습니다.EXTRACT(field FROM source)field란 year, month, day 따위의 날짜/시간 데이터 요소를 말하고source란 실제 timestamp 값을 의미합니다. '2021-01-01 15:00:00' 와 같은 값입니다. 간단히 문법은 살펴보았으니..
이전에 Postgresql 관련 내용에서 1개의 컬럼으로 10개의 레코드가 1~10형태로 나올 recursive 문을 짜시오.라는 문제를 내며 postgresql의 recursive문에 대해서 포스팅을 한 적이 있었는데요. sas-study.tistory.com/165[Postgresql] recursive 문이란?? 개념 및 예제신입으로 처음 들어간 회사에서 oracle DB말고 postgresql이라는 DB를 사용해서 Postgresql을 처음 배웠을때 recursive 문을 배웠습니다. 자바의 for문과 비슷한 원리로 돌아가는 반복문인데 구조는 다음과 sas-study.tistory.com당시 하나의 컬럼에 대해서 1부터 10의 row를 반환하도록 하는 방법이었습니다. 즉, 일련의 숫자를 테이블형태..