categories > spring study
date : February 15, 2024

Spring JPA update가 아닌 insert

Given

When

Then - error

Before

num(pk) id min max
1 82 145 185
2 83 145 185

After

num(pk) id min max
1 82 145 185
2 83 145 185
3 82 162 180
4 83 170 190

⚙ 이떄 CustomMachine과 CustomFood 객체 구성은 Mysql DB의 custom_food, custom_machine의 구성과 같다.


Given

PrintDataV1.java[customCheatMachine()]

customCheatMachineMap.put("initMin", Integer.toString(foundCheatMachine.getMin()));
customCheatMachineMap.put("initMax", Integer.toString(foundCheatMachine.getMax()));

Untitled

add initMin , initMax data from machineRepository

PrintDataV1.java[customCheatFood()]

customCheatFoodMap.put("initMin", Integer.toString(foundCheatFood.getMin()));
customCheatFoodMap.put("initMap", Integer.toString(foundCheatFood.getMax()));

Untitled

💡 MachineRepository, FoodRepository has id ,name , min, max value from zenput


When

SaveData logic

SaveData.java[Interface]

Untitled

customCheatMachineDataSave()

customCheatFoodDataSave() 메소드를 인터페이스에 추가해준다.

SaveDataV1.java[customCheatFoodDataSave()]

Untitled

CustomFood 객체를 생성해서 post로 전달 받은 인자값을 저장한다.

저장한후 jpa의 save기능을 이용해서 저장한다.

SaveDataV1.java[customCheatMachineDataSave()]

Untitled

CustomMachine 객체를 생성해서 post로 전달 받은 인자값을 저장한다.

저장한후 jpa의 save기능을 이용해서 저장한다.


Then - error

SaveData 로직 오류

CustomFood, CustomMachine을 새롭게 생성한 후 저장하니 Update가 아닌 새로운 값을 insert해 버렸다.


Solution

way1

Untitled

@Modifying 애노테이션은 int 타입밖에 반환을 할 수 없다.

그렇기 때문에 @Modifying 애노테이션을 이용한 쿼리를 사용해 CustomFood, CustomMachine객체를 반환할 수 없게 되었다.

💰way2

Untitled

따라서 해당 modifying 구문을 select 해서 customFood를 찾아주는 것이 아닌 아예 다이렉트로 update를 하는 구문으로 변경했다.

이때 @Param 애노테이션을 사용해서 매핑하도록 설정했다. 자바에서 인자와 이름이 같은 경우 사용하지 않아도 되지만 아직 그렇게 세팅되지 않은 곳이 많기때문에 꼭 써주는 것이 좋다.

만약 CustomFood 객체를 찾아서 업데이트 하는 경우는

CustomFood.set(~~)를 이용해서 값을 업데이트 하면 된다.


Reference

스프링 데이터 JPA - 벌크 업데이트