로그인한 사용자가 현재 열려있는 Sheet에서 새로운 글(Board)을 작성하려고한다
즉, 새로운 board를 create 해아한다.
그러려면 어떤 Sheet에서 board를 생성할것인지 Sheet정보를 같이 담아줘야한다
그리고 누가 생성했는지에 대한 현재 로그인한 사용자의 Member정보도 담아줘야한다.
@Entity(name = "moneyboard")
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MoneyBoard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "member_id")
private MoneyMember member;
private Long eventDate;
private String eventTitle;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "sheet_id")
private Sheet sheet;
}
| build패턴 사용시
타입이 일반타입의 필드일 경우
.필드명(값) 으로해서 build()로 마무리하여 객체를 생성해주고
타입이 참조타입의 필드일 경우
MoneyMember member = MoneyMember.builder()
.id(request.getMemberId())
.build();
moneyBoard.setSheet(sheet);
이런식으로 build()이후에 set으로 값을 설정해주면 됨
moneyBoard.setSheet(sheet)이렇게 쓰기 귀찮으면
.build().setSheet(sheet) 이런식으로 연결해서 써둬됨
HTML
<table class="create_tb">
<thead>
<td>
<div class="create_tb_title">
<p>등록</p>
<button id="cr_xbtn" onclick="closePlus(event)">x</button>
</div>
</td>
</thead>
<tbody>
<td>
<div class="create_content_div">
<p>일(day)과 내용을 입력해주세요</p>
<p><input id="date_info" type="text" placeholder="숫자만 입력가능합니다"></p>
<p><input id="content_info" type="text" placeholder="ex) 전기요금, 가스요금"></p>
<p><input id="submit_btn" type="submit" value="등록" th:onclick="|addPlan(${sheetId})|"></p>
<p id="tip">tip: 31일 이상도 입력가능합니다</p>
</div>
</td>
</tbody>
</table>
JS
function addPlan(sheetId){
const dateInfo = document.getElementById('date_info');
const contentInfo = document.getElementById('content_info');
const plusbtn = document.getElementById('plusbtn');
let create_div = document.getElementById('create_div');
var dateInfo_RegExp = /^[0-9]{1,10}$/; //날짜는 숫자 형식 유효성검사 정규식
if(!dateInfo_RegExp.test(dateInfo.value)){
alert('날짜는 숫자로 입력해주세요');
dateInfo.focus();
return false;
}
$.ajax({
type : 'POST', // 타입 (get, post, put 등등)
url : '/main/addPlan', // 요청할 서버url
dataType : "json",
contentType:"application/json",
data : JSON.stringify({
memberId: memberId.value,
eventDate: dateInfo.value,
eventTitle: contentInfo.value,
sheetId:sheetId
}),
success : function(result) {
openPlanner(sheetId)
plusbtn.classList.remove('open')
create_div.style.display = 'none';
ckeck = false;
dateInfo.value='';
contentInfo.value='';
}}
)
}
function openPlanner(sheetId){
$.ajax({
type : 'GET', // 타입 (get, post, put 등등)
url : '/main/'+sheetId, // 요청할 서버url
async:false,
dataType : "HTML",
success : function(result) { // 결과 성공 콜백함수
$('.content_box').children().remove();
$('.content_box').html(result);
}}
)
}
MainApiController
@RestController
@RequestMapping("main")
@RequiredArgsConstructor
public class MainApiController {
private final BoardApiLogicService boardApiLogicService;
@PostMapping("/addPlan")
public Header<BoardApiResponse> addPlan(@RequestBody BoardApiRequest request){
return boardApiLogicService.addPlan(request);
}
}
BoardApiLogicService
@Service
@RequiredArgsConstructor
public class BoardApiLogicService {
private final MoneyBoardRepository moneyBoardRepository;
private final SheetRepository sheetRepository;
private final MoneyMemberRepository moneyMemberRepository;
public Header<BoardApiResponse> response(MoneyBoard moneyBoard){
BoardApiResponse boardApiResponse = BoardApiResponse.builder()
.id(moneyBoard.getId())
.eventDate(moneyBoard.getEventDate())
.eventTitle(moneyBoard.getEventTitle())
.sheet(moneyBoard.getSheet())
.build();
return Header.OK(boardApiResponse);
}
public Header<BoardApiResponse> addPlan(BoardApiRequest request) {
MoneyBoard moneyBoard = MoneyBoard.builder()
.eventDate(request.getEventDate())
.eventTitle(request.getEventTitle())
.build();
// 방법 1. detached entity passed to persist 에러발생시
// MoneyBoard엔티티에 cascade = CascadeType.ALL 제거해야함
Sheet sheet = Sheet.builder()
.id(request.getSheetId())
.build();
MoneyMember member = MoneyMember.builder()
.id(request.getMemberId())
.build();
moneyBoard.setSheet(sheet);
moneyBoard.setMember(member);
// 방법 2. cascade = CascadeType.ALL 제거안해도 에러안남
// Optional<Sheet> sheet = sheetRepository.findById(request.getSheetId());
// Optional<MoneyMember> member = moneyMemberRepository.findById(request.getMemberId());
// moneyBoard.setSheet(sheet.get());
// moneyBoard.setMember(member.get());
// 공통
MoneyBoard newBoard = moneyBoardRepository.save(moneyBoard);
return response(newBoard);
}
}
방법1 - 객체를 직접 생성하여 필요한 값만 넣은 후 set
방법2 - 값에 해당하는 객체를 검색하여 set
반응형
'웹 개발 > 🍃 SpringBoot' 카테고리의 다른 글
SpringBoot | 카카오톡 간편로그인 구현 OAuth 2.0 (0) | 2023.05.24 |
---|---|
SpringBoot | 로그인,세션등록 (0) | 2023.05.24 |
SpringBoot | CRUD 구현 - 글삭제(Delete) (0) | 2023.05.21 |
SpringBoot | CRUD 구현 - 제목변경(Update) (0) | 2023.05.21 |
SpringBoot | CRUD 구현 - 회원가입(Create),Fetch (0) | 2023.05.20 |