maybeCafe -2-

하파타카·2022년 5월 3일
0

SpringBoot와 MyBatis를 이용한 maybeCafe(아마도카페)프로젝트

DB 용어개념정리


가입인사 -2-

가입인사는 수정기능 없이 조회, 등록, 삭제기능만 지원.

삭제

service, mapper

- GreetBoardService.interface -

public void delete(int gno);	// 가입인사 삭제

- GreetBoardMapper.interface -

public void delete(int gno);	// 가입인사 삭제

- GreetBoardMapper.xml -

<delete id="delete">
	DELETE FROM greetboard WHERE gno = #{gno}
</delete>

- GreetBoardServiceImpl -

@Override
public void delete(int gno) {
	gBoardMapper.delete(gno);
}

JUnit5 테스트

- GreetBoardMapperTest -

@MybatisTest
@AutoConfigureTestDatabase(replace = Replace.NONE)	// 현재 연결된 실제DB로 테스트함을 의미
@Rollback(value = false)							// 테스트시 롤백 안함
@Log
public class GreetBoardMapperTest {
	// JUnit 5버전으로 테스트
	@Autowired
	private GreetBoardMapper gBoardMapper;
	
	@Test
	public void testDeleteGreetBoard() {
		gBoardMapper.delete(4);
	}
}

gno 4번 가입인사 삭제

controller

- GreetBoardController -

@GetMapping("/delete")
public String greetDelete(@RequestParam("gno") int gno, RedirectAttributes attr) {
	gBoardService.delete(gno);
	attr.addFlashAttribute("message", "삭제되었습니다.");
	return "redirect:/greetboard/list";
}

view

- greetList.html -

<body>
<h3>가입인사</h3>
<div>
  <p><a th:href="@{/}">메인페이지</a></p>
</div>
<div>
  <form th:action="@{/greetboard/write}" method="post" th:object="${board}">
    <div>
      <label for="content">내용</label>
      <textarea th:field="*{content}" rows="3" required></textarea>
    </div>
    <div>
      <label for="writer">작성자</label>
      <input type="text" th:field="*{writer}" required />
    </div>
    <button type="submit">가입인사 남기기</button>
  </form>
</div>
<div>
  <table>
    <thead>
      <tr>
        <th>NO</th>
        <th>등록일</th>
        <th>작성자</th>
        <th>내용</th>
        <th></th>
      </tr>
    </thead>
    <tbody>
      <tr th:each="board : ${greetboard}">
        <td><span th:text="${board.gno}"></span></td>
        <td><span th:text="${#temporals.format(board.regdate , 'yyyy-MM-dd a hh:mm:ss')}"></span></td>
        <td><span th:text="${board.writer}"></span></td>
        <td><span th:text="${board.content}"></span></td>
        <td><a th:href="@{/greetboard/delete(gno=${board.gno})}" onclick="return deleteConfirm();">삭제하기</a></td>
      </tr>
    </tbody>
  </table>
</div>
<script>
  function deleteConfirm() {
    return confirm('삭제하시겠습니까?');
  }
</script>
<script th:if="${message}">
  let m = '[[${message}]]'; // 리다이렉트로 넘어온 메시지 저장
  alert(m); // 화면에 메시지 띄우기
</script>
</body>

반복문 내의 gno데이터를 이용해 가입인사를 삭제

<a th:href="@{/greetboard/delete(gno=${board.gno})}" onclick="return deleteConfirm();">삭제하기</a>

function deleteConfirm() {
  return confirm('삭제하시겠습니까?');
}

삭제여부를 javascript를 통해 묻되 확인을 누르면 다시 a태그의 th:href주소로 페이지를 이동하며, 취소를 누르면 아무 동작도 하지않음.
=> href의 실행보다 onclick의 실행이 더 먼저 되어야하므로 onclick="return 호출할함수명();"으로 함수명 앞에 return을 추가함.

ㄴ> 참고
참고2

테스트


8번 가입인사가 삭제됨을 확인가능.

profile
천 리 길도 가나다라부터

0개의 댓글