위 spring 공식문서만 보더라도 내용이 아주 간단하기 때문에, 쉽게 이해할 수 있다.
1:N 관계를 하나의 객체에 맵핑하기위해서 List와 Map 컬렉션을 사용하기 위해서는 _key와 같은 컬럼을 필요로 한다.
Map을 활용할때는 key로 활용되고, List를 활용한다면 key를 통해서 순서를 보장한다.
하지만 @MappedCollection을 활용해서 idColumn과 Key컬럼을 지정해준다면 _key와 같은 컬럼을 굳이 만들지 않아도 될 수 있다.
현재 진행중인 미션 프로젝트의 예제로 dish는 여러 이미지를 가지는 1:N 관계이다.
CREATE TABLE image(
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(500) not null,
dish_id BIGINT,
foreign key (dish_id) references dish(id)
);
public class Dish {
@Id
private final Long id;
private final Long categoryId;
// 순서가 꼭 보장할 필요가 없을 것 같아 id를 keyColumn으로 활용
// dish의 id가 아닌 image의 id
@MappedCollection(idColumn = "dish_id", keyColumn = "id")
private final List<Image> images;
...
}
public class Image {
@Id
private final Long id;
private final String name;
}
[SELECT "IMAGE"."ID" AS "ID", "IMAGE"."NAME" AS "NAME", "IMAGE"."ID" AS "ID" FROM "IMAGE" WHERE "IMAGE"."DISH_ID" = ? ORDER BY "ID"]
// 일치하는 id의 dish 정보를 가져오는 쿼리
[SELECT "DISH"."ID" AS "ID", "DISH"."NAME" AS "NAME", "DISH"."PRICE" AS "PRICE", "DISH"."STOCK" AS "STOCK", "DISH"."EVENT_ID" AS "EVENT_ID", "DISH"."CATEGORY_ID" AS "CATEGORY_ID", "DISH"."DESCRIPTION" AS "DESCRIPTION", "DISH"."POINT_PERCENT" AS "POINT_PERCENT", "DISH"."DELIVERY_TYPE" AS "DELIVERY_TYPE", "DISH"."DISCOUNT_POLICY" AS "DISCOUNT_POLICY" FROM "DISH" WHERE "DISH"."ID" = ?]
// 일치하는 dish_id의 image를 가져오는 쿼리
[SELECT "IMAGE"."ID" AS "ID", "IMAGE"."NAME" AS "NAME", "IMAGE"."ID" AS "ID" FROM "IMAGE" WHERE "IMAGE"."DISH_ID" = ? ORDER BY "ID"]
2022-04-22 02:23:22.627 WARN 7786 --- [ main] o.s.d.j.core.convert.ResultSetAccessor : ResultSet contains ID multiple times
2022-04-22 02:23:22.628 WARN 7786 --- [ main] o.s.d.j.core.convert.ResultSetAccessor : ResultSet contains ID multiple times
2022-04-22 02:23:22.628 WARN 7786 --- [ main] o.s.d.j.core.convert.ResultSetAccessor : ResultSet contains ID multiple times
정상적으로 작동하고 원하는 결과를 얻지만, 1:N관계를 내부 객체로 두어서 적용하게 되면 이렇게 로그가 나온다.
해당 로그에 대한 설명자료
https://stackoverflow.com/questions/69586530/spring-data-jdbc-one-to-many-relation-causes-lots-of-log-warnings
https://github.com/spring-projects/spring-data-relational/issues/1073