URL에서 파라미터 값과 이름을 함께 전달할때 사용하는 방식이다
- Spring에서 비동기 처리룰 하는 경우 @RequestBody, @ResponseBody 사용한다.
웹에서 화면전화(새로고침) 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어진다.- 비동기통신을 하기위해서는 client -> server(Request), server -> client(Response) 보낼때 본문에 데이터를 담아서 보내야한. 이 본문이 body이다
- 클라이언트에서 서버로 필요한 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아서 서버로 보내면 서버에서는 @RequestBody을 사용하여 HTTP요펑 본문에 담김 값들을 자바객체로 변화시켜, 객체에 저장한다.
- 서버에서 클라이언트로 응답 데이터를 전송허기 위해 @ResponseBody을 사용하여 자바 객체를 HTTP응답 본문의 객체로 변환하여 클라이언트로 전송한다.
@@OneToMany(일대다)를 양방향 연관관계를 맺는다.부모 엔티티를 조회 시 연관된 자식 엔티티까지 조회하므로 편하다. 하지만 예상치 못한 쿼리가 나가는 것을 확인할 수 있다.
cascade는 부모가 삭제 되면 연관된 자식도 같이 삭제,수정 등등이 된다.
MapperBy옵션은 두 객체중 하나의 객체만 테이블을 관리할 수 있도록 정하는 것이다.
테이블을 보면 restaurant1객체에 MapperBy가 적용된 것을 볼 수 있는데 이 경우 restaurant1객체는 menu1 테이블을 관리할 수 없고 menu1객체만이 권한을 받고 주인이 아닌 쪽은 조회만 가능해진다.즉, MapperBy가 정의되지 않은 객체가 주인이 되는 것이다.
-referencedColumnName 옵션의 기능은 외래 키가 참조하는 대상 테이블의 컬럼명을 지정해 준다.Default 기본값은 참조하는 테이블의 기본키(PK) 컬럼명
=> 결과
<!DOCTYPE html>
<html>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Select</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp"
crossorigin="anonymous">
<!-- Font Awesome 아이콘 CDN -->
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
integrity="sha512-iecdLmaskl7CVkqkXNQ/ZH/XLlvWZOJyj7Yy7tcenmpD1ypASozpmT/E0iPtmFIB46ZmdtAc9eNBvH0H/ZpiBw=="
crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.3/font/bootstrap-icons.css">
</head>
<body>
<form th:action="@{/restaurant1/selectlist.food}" method="get" th:object="${search}">
<input type="hidden" name="page" value="1"><br/>
<select name="type" th:field="${search.type}">
<option th:each="tmp, idx: ${search.typeCode}" th:value="${tmp}" th:text="${search.typeName[idx.index]}" ></option>
</select>
<input type="text" name="text" th:field="${search.text}" placeholder="검색어"/>
<input type="submit" value="검색"/>
</form>
<table class="container table table-hover border border-dark">
<thead style="background-color: lightgray;">
<tr>
<th scope="col">번호</th>
<th scope="col">이름</th>
<th scope="col">폰번호</th>
<th scope="col">타입</th>
<th scope="col">날짜</th>
<th>버튼</th>
</tr>
</thead>
<tbody>
<tr th:each="one : ${list}">
<td scope="row" th:text="${one.no}"></td>
<td><a th:href="@{/restaurant/selectone.do(no=${one.no})}" th:text="${one.name}"></a></td>
<td th:text="${one.phone}"></td>
<td th:text="${one.type}"></td>
<td th:text="${one.regdate}" ></td>
<td>
<a th:href="@{/menu1/insert.food(rphone=${one.phone})}"><button>메뉴등록</button></a>
<button>수정</button>
<button th:onclick="deleteAction([[${one.phone}]])">삭제</button>
</td>
</tr>
</tbody>
</table>
<th:block th:each="num : ${#numbers.sequence(1, pages )}">
<a th:href="@{/restaurant1/selectlist.food(page=${num},type=${search.type},text=${search.text},)}" th:text="${num}"></a>
</th:block>
<form th:action="@{/restaurant1/delete.food}" method="post" id="form2" style="display: none;">
<input type="hidden" name="phone" id="hidden_phone">
</form>
<script th:inline="javascript">
function deleteAction(phone){
if(confirm('삭제할까요?')){
document.getElementById('hidden_phone').value=phone;
document.getElementById('form2').submit();
}
}
</script>
</body>
</html>
-타입별로 선택한 후 원하는 입력값이 포함된 것을 검색하여 그게 걸맞은 입력값을 조회하여 페이지네이션으로 뽑아낸다.