왜 의도치 않은 데이터가 추가되어 수정될까.

이유는 orElse() 때문이었다. [해결] 수정 시 의도치 않은 객체가 저장되는 문제

제대로 알고 사용했었어야 했는데, 내부 로직이 수행된다 는 것을 아예 생각도 못하고 있었다.

아래와 같은 고민을 하고 있었는데, 일단은 작성해두자. 해결은 id를 부여받아서 해결했다.

이 글은 그냥 고민을 끄적인 글이다.

// 이건 있는것만 수정되는 로직이다. 없으면 추가가 안된다.
// 그리고 이건 ID로 하면 안될 것 같다. 추가가 될 수도 있는데, Id가 부여될만한 로직이 없기 때문이다. 
		-> 사실 아이디가 제일 정확하긴 한데..
// id가 null이면 새로 생성해서 부여할까..? -> 이거 먼저 해보자

// 그렇다고 이름으로만 찾기에는, 다른 글의 field, stack까지 가져오게 될 것 같다. 공통부분이 많기 때문..
// 그래서 다른 글의 필드가 수정되는 문제가 발생할 수도 있을 것이다.
// 해당하는 글의 field만 수정해야하고, 해당 글의 stack만 수정되어야 한다.

// 필요한것
// 1. 해당 Post에 귀속된 Field만 수정하는 로직
// 2. 해당 Post에 귀속된 Field의 stack만 수정하는 로직

// 아래 로직들은 추가가 필요하기도 하다. updateOrSave를 쓰자.

그리고 생각해보니, 수정 및 분야(혹은 기술스택) 추가는 잘 되지만, 수정할 때 원래 존재하던 내용을 빼고싶을 경우가 적용이 되지 않는다.

예를 들어, 백엔드 - 스프링 으로 설정해두었던 정보를, 백엔드 - Node.js로 변경하기 위해 수정 데이터를 보내면 백엔드 - 스프링, Node.js로 추가되는 방식으로 수정되는 것이다. 이는 의도와 다르게 작동하는 경우이다.

이럴 경우, 백엔드 - 스프링의 스프링 이라는 값은 “” 라는 blank로 처리가 되도록 하는게 좋을 것 같은데, 이럴 경우 체크박스를 이용해야 하는지를 문의해야 할 것 같다.

즉, 나는 이렇게 하고싶다.

모집 분야


백엔드

기술 스택


모집 인원


2

종합 요구 능력치


10

처음 작성 시 위와 같은 형태로 값을 서버에 전달한다. 해당 값은 아래와 같은 JSON 형태로 전달이 된다.

{
	글의 정보...
	...
	모집 분야 : [
		{
			필드명 : 백엔드
			모집인원 : 2
			종합 요구 능력치 : 10
			
			기술 스택 : [
					{
						스택 이름 : 스프링
					}
			]
	]
						

그리고 해당 화면을 조회하면 아래와 같은 형태로 조회가 된다. id값이 추가가 되는 것. 해당 id값들을 기반으로 수정 로직을 구현하였다.

{
	글 id : 1
	글의 정보...
	...
	모집 분야 : [
		{
			필드 id : 1
			필드명 : 백엔드
			모집인원 : 2
			종합 요구 능력치 : 10
			
			기술 스택 : [
					{
						스택 id : 1
						스택 이름 : 스프링
					}
			]
	]
						

모집 분야


백엔드

기술 스택


모집 인원


2

종합 요구 능력치


10

그리고 나서 위와 같이 수정한다고 가정하자. 요구되는 기술 스택을 잘못 적어서, 스프링이 아닌 Node.js로 변경하려고 한다. 그럼 아래와 같은 수정 요청이 날아갈 것이라고 예상한다.

{
	글 id : 1
	글의 정보...
	...
	모집 분야 : [
		{
			필드 id : 1
			필드명 : 백엔드
			모집인원 : 2
			종합 요구 능력치 : 10
			
			기술 스택 : [
					{
						스택 id : null
						스택 이름 : Node.js
					}
			]
	]
						

그런데 여기서 고민이 있다. 위와 같이 수정 요청이 날아올 경우, 내가 예상했던 대로 스프링 입력이 취소되고 Node.js로 입력되는 것이 아닌, Node.js 입력이 “추가"되는 걸로 수정 처리가 될 것이다. 즉 내가 원하는 수정 결과는 위와 같은 결과였으나, 실질적으로는 아래의 결과가 나타나게 되는 것이다.

모집 분야


백엔드

기술 스택


모집 인원


2

종합 요구 능력치


10