Sql 4

[MyBatis] MyBatis와 @Builder 사용 시 resultMap 매핑 문제 해결하기

1. 문제 상황MyBatis를 사용할 때 일반적으로 xml의 을 통해 SQL 조회 결과를 DTO에 매핑한다.기본적인 @Getter, @Setter 가 있는 DTO 에서는 resultMap 의 순서와 DTO 필드 순서가 맞지 않더라도 필드 이름을 기준으로 매핑되기 때문에 큰 문제가 발생하지 않는다. 하지만 @Builder 를 사용한 DTO 에서는 resultMap 의 필드 순서와 DTO 의 필드 순서가 맞지 않으면 매핑 오류가 발생할 수 있다. 2. 코드 예시 SELECT * FROM TABLE_A @Getter@Builderpublic class BuilderDto { private String name; private int age;} 3. 원인Java 에서는 일..

Sql 2024.10.27

[PostgreSQL] RETURNING

우리는 테이블의 데이터를 추가/수정/삭제한 뒤 변경사항에 대한 정보를 얻기 위하여, 먼저 데이터 조작이 끝난 뒤 SELECT구문을 사용해 왔다. 하지만 만약 데이터를 조작하는 동안 수정된 행의 데이터를 얻을 수만 있다면 정말 유용하지 않을까? 그게 바로 RETURNING 문법이다!! INSERT, UPDATE, DELETE 명령어는 모두 RETURNING 절을 추가적으로 사용할 수가 있다. 예를 들면, food라는 테이블을 만들고, 데이터를 하나 추가해 보자. CREATE TABLE food (name, color, id serial primary key); INSERT INTO food (name, color) VALUES ('apple', 'red') RETURNING id; RETURNING을 사용..

Sql 2023.09.08

[PostgreSQL] LATERAL Subqueries

서브쿼리에서 외부 칼럼을 참조하고 싶으면 어떻게 해야 할까? 서브쿼리는 독립적이기 때문에, 다른 FROM에 속한 항목들을 참조할 수는 없다. 하지만 !! FROM절에 있는 서브쿼리에서는 LATERAL 키워드를 이용하면 언제든지 가능하다. SELECT * FROM A, LATERAL ( SELECT * FROM B WHERE A.id = B.id ) BB; SELECT * FROM A, B WHERE A.id = B.id; 다른 FROM절의 항목을 이용할 수 있기 때문에, 첫 번째 구문처럼 사용할 수도 있지만... 굳이 LATERAL을 이용하지 않고도 두 번째 구문처럼 더 간단하게 동일한 결과를 얻을 수 있다. 하지만 LEFT JOIN과 LATERAL 서브쿼리를 함께 사용하면 JOIN 조건으로 서브쿼리 밖..

Sql 2023.09.08

[PostgreSQL] UPSERT

관계형데이터베이스에서 upsert는 'merge'라는 용어로 사용되기도 한다. PostgreSQL에서 새로운 행을 테이블에 추가하려고 할 때, 시스템은 해당 행이 이미 테이블에 존재하는지 확인한다. 이미 존재한다면, 새로운 데이터로 해당 행을 업데이트하고, 행이 존재하지 않는 경우에는 새로운 데이터를 포함하는 행을 테이블에 추가한다. 그래서 우리가 이 동작을 upsert라고 부르는 이유다. (update와 insert의 결합) INSERT INTO table_name(column_list) VALUES (value_list) ON CONFLICT target action; PostgreSQL에서는 upsert를 지원해주기 때문에, INSERT문에 ON CONFLICT target action 을 추가하면..

Sql 2023.09.08