date : February 15, 2024
Spring JPA update가 아닌 insert
Given
- Spring JPA를 이용해서 데이터를 Update한다.
- CustomMachine과 CustomFood 테이블에 update를 해야한다.
- 사용자는 CustomMachine과 CustomFood에 들어있는 데이터 중 일부를 Update해야한다.
When
- jpa의 save 메소드를 이용해서 새로운 데이터를 insert하는 것이 아닌 기존의 data를 update 하려한다.
Then - error
- 기존의 데이터를 선택해서 update하는 것이 아닌 새로운 데이터를 넣어버렸다.
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()));

add initMin , initMax data from machineRepository
PrintDataV1.java[customCheatFood()]
customCheatFoodMap.put("initMin", Integer.toString(foundCheatFood.getMin()));
customCheatFoodMap.put("initMap", Integer.toString(foundCheatFood.getMax()));

💡 MachineRepository, FoodRepository has id ,name , min, max value from zenput
When
SaveData logic
SaveData.java[Interface]

customCheatMachineDataSave()
customCheatFoodDataSave() 메소드를 인터페이스에 추가해준다.
SaveDataV1.java[customCheatFoodDataSave()]

CustomFood 객체를 생성해서 post로 전달 받은 인자값을 저장한다.
저장한후 jpa의 save기능을 이용해서 저장한다.
SaveDataV1.java[customCheatMachineDataSave()]

CustomMachine 객체를 생성해서 post로 전달 받은 인자값을 저장한다.
저장한후 jpa의 save기능을 이용해서 저장한다.
Then - error
SaveData 로직 오류
CustomFood, CustomMachine을 새롭게 생성한 후 저장하니 Update가 아닌 새로운 값을 insert해 버렸다.
Solution
way1

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

따라서 해당 modifying 구문을 select 해서 customFood를 찾아주는 것이 아닌 아예 다이렉트로 update를 하는 구문으로 변경했다.
이때 @Param 애노테이션을 사용해서 매핑하도록 설정했다. 자바에서 인자와 이름이 같은 경우 사용하지 않아도 되지만 아직 그렇게 세팅되지 않은 곳이 많기때문에 꼭 써주는 것이 좋다.
만약 CustomFood 객체를 찾아서 업데이트 하는 경우는
CustomFood.set(~~)를 이용해서 값을 업데이트 하면 된다.