
๋ก๊ทธ์ธ :
- ๊ธ ์์ฑ ์ ์์ฑ์๋ ๋ก๊ทธ์ธํ ์ฌ๋์ ์ด๋ฉ์ผ
- ๋ก๊ทธ์ธํ ์ฌ๋๋ง ๊ธ์ฐ๊ธฐ ๊ฐ๋ฅ
- ์์ฑ์ ์์ ๊ธ๋ง ์์ /์ญ์ ๊ฐ๋ฅ
- ์์ ์ ํ์์ ๋ณด๋ง ์์ /์ญ์ ๊ฐ๋ฅ
- ํ์ ํํด ์ ๊ฒ์๊ธ ์ญ์
ALTER TABLE board ADD COLUMN member_id INT REFERENCES member (id);
@Select("""
SELECT b.id,
b.title,
m.nick_name writer
FROM board b JOIN member m ON b.member_id = m.id
ORDER BY id DESC
LIMIT #{offset}, 10
""")
List<Board> selectAllByPage(int offset);
Authentication์ ์์ฑํฉ๋๋ค. Authentication ๊ฐ์ฒด์๋ form์์์ username๊ณผ password๋ UserDetails(CustomUser)์ username๊ณผ password๋ฅผ ๋น๊ตํ ๋ ์ฌ์ฉํ UserDetails ๊ฐ์ฒด๊ฐ ๋ก๊ทธ์ธ ์ฑ๊ณตํ์ ๋ Authentication์ ๋ค์ด์์ต๋๋ค.public void add(Board board, Authentication authentication) {
Object principal = authentication.getPrincipal();
if (principal instanceof CustomUser user) {
Member member = user.getMember();
board.setMemberId(member.getId());
mapper.insert(board);
}
}
@Getter
public class CustomUser extends User {
private Member member;
public CustomUser(Member member) {
super(member.getEmail(), member.getPassword(), List.of());
this.member = member;
}
}
@Data
public class Board {
private Integer id;
private String title;
private String content;
// ์์ฑ์ nickName ์ฉ์ผ๋ก ์ฌ์ฉ๋จ
private String writer;
private LocalDateTime inserted;
private Integer memberId;
}
@Insert("""
INSERT INTO board (title, content, member_id)
VALUES (#{title}, #{content}, #{memberId})
""")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(Board board);
@Select("""
SELECT b.id,
b.title,
b.content,
b.inserted,
m.nick_name writer,
m.id member_id
FROM board b JOIN member m ON b.member_id = m.id
WHERE b.id = #{id}
""")
Board selectById(Integer id);
@PostMapping("/delete")
public String delete(Integer id, Authentication authentication) {
if (service.hasAccess(id, authentication)) {
service.remove(id);
}
return "redirect:/";
}
public boolean hasAccess(Integer id, Authentication authentication) {
// ๋ก๊ทธ์ธ ์ฑ๊ณต ๋ชปํ๋ค๋ฉด false
if (authentication == null) {
return false;
}
// ๋ก๊ทธ์ธ ์ฑ๊ณต ์
Board board = mapper.selectById(id);
Object principal = authentication.getPrincipal();
if (principal instanceof CustomUser user) {
Member member = user.getMember();
return board.getMemberId().equals(member.getId());
}
return false;
}
@Select("""
SELECT b.id,
b.title,
b.content,
b.inserted,
m.nick_name writer,
m.id member_id
FROM board b JOIN member m ON b.member_id = m.id
WHERE b.id = #{id}
""")
Board selectById(Integer id);
@PostMapping("/modify")
public String modifyPost(Board board, Authentication authentication, RedirectAttributes rttr) {
if (service.hasAccess(board.getId(), authentication)) {
service.modify(board);
}
rttr.addAttribute("id", board.getId());
return "redirect:/board";
}
<sec:authorize access="isAuthenticated()"> <%-- ๋ก๊ทธ์ธ์ด ๋์๋์ง ํ์ธ--%>
<%-- 1. ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์์ id์ 2.๊ฒ์๋ฌผ์ memberId๊ฐ ๊ฐ์ผ๋ฉด ๋ฒํผ ๋ณด์ฌ์ค--%>
<sec:authentication property="principal.member" var="member"/>
<c:if test="${member.id eq board.memberId}">
<div class="mb-3">
<button form="formDelete" class="btn btn-danger">์ญ์ </button>
<a href="/modify?id=${board.id}" class="btn btn-secondary">์์ </a>
</div>
</c:if>
</sec:authorize>
@PostMapping("remove")
public String remove(Integer id, Authentication authentication) {
if (service.hasAccess(id, authentication)) {
service.remove(id);
}
return "redirect:/logout";
}
public boolean hasAccess(Integer id, Authentication authentication) {
if (authentication == null) {
return false;
}
Object principal = authentication.getPrincipal();
if (principal instanceof CustomUser user) {
Member member = user.getMember();
return member.getId().equals(id);
}
return false;
}
ํจ์ค์๋๋ฅผ ์ํธํํด์ ์ ์ฅ๋ฉ๋๋ค.
public void modify(Member member) {
if (member.getPassword() != null && member.getPassword().length() > 0) {
// ์ํธ๋ฅผ ์
๋ ฅํ์ ๋๋ง ๋ณ๊ฒฝ
member.setPassword(encoder.encode(member.getPassword()));
} else {
// ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ์กด ์ํธ ์ ์ง
Member old = mapper.selectById(member.getId());
member.setPassword(old.getPassword());
}
mapper.update(member);
}
public void remove(Integer id) {
// board ํ
์ด๋ธ์์ ๋ ์ฝ๋ ์ญ์
boardMapper.deleteBoardByMemberId(id);
// member ํ
์ด๋ธ์์ ๋ ์ฝ๋ ์ญ์
mapper.deleteById(id);
}