

<aside> 💡
<button type="submit">❤️좋아요</button> 좋아요 버튼 클릭시
컨트롤러에서 → 만약 로그인이 되어 있지 않다면 로그인폼으로 이동
//로그인 여부 확인 MemberDomain memberDomain = (MemberDomain) session.getAttribute("member"); if(memberDomain == null) { return "redirect:/member/loginForm.do"; }
만약 로그인이 되어 있다면
// 세션에서 아이디 가져오기 MemberDomain memberDomain = (MemberDomain) session.getAttribute("member"); myhomeDomain.setMemberId(memberDomain.getMemberId()); System.out.println(memberDomain.getMemberId());
로그인 정보를 가져와서 boardMyHomeLikes 테이블에 게시글번호(boardMyhomeArticleNo)와 아이디(memberId)가 저장됨 그리고 boardMyhome테이블의 boardMyhomeLikes은 +1이 됨
버튼 한번 더 클릭시 boardMyHomeLikes 테이블에 게시글번호(boardMyhomeArticleNo)와 아이디(memberId)가 저장되어있는지 확인하고 boardMyHomeLikes테이블에서 게시글번호와 아이디가 동시에 삭제 되고, boardMyhome테이블의 boardMyhomeLikes -1이 됨
likeList(), addLikes(), deleteLikes()
</aside>
조회수 좋아요수 증감시 버튼 색상 변경
컨트롤러
redirectAttributes.addFlashAttribute("isLiked", !isLiked);
넣은이유: 버튼클릭시 true확인위해 // 반전 값 사용
//좋아요수
@RequestMapping(value = "/likes.do", method = {RequestMethod.GET, RequestMethod.POST})
public String likes(@RequestParam("boardMyhomeArticleNo") int boardMyhomeArticleNo,
HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
System.out.println("좋아요 요청 들어온 게시물번호: " + boardMyhomeArticleNo);
//로그인 여부 확인
MemberDomain memberDomain = (MemberDomain) session.getAttribute("member");
if(memberDomain == null) {
return "redirect:/member/loginForm.do";
}
//세션에서 아이디 가져오기
String memberId = memberDomain.getMemberId();
System.out.println("좋아요 테이블에 추가될 아이디: "+ memberId);
//좋아요 여부확인 후 -> 추가 또는 취소 할거야
boolean isLiked = myhomeService.isLiked(boardMyhomeArticleNo, memberId);
if(isLiked) {
myhomeService.deleteLikes(boardMyhomeArticleNo, memberId);
} else {
myhomeService.addLikes(boardMyhomeArticleNo, memberId);
}
//좋아요 수 조회
int boardMyhomeLikes = myhomeService.likesList(boardMyhomeArticleNo);
//jsp에 넘겨줄것
// Flash Attribute로 값 전달 (URL에 노출되지 않음)
redirectAttributes.addFlashAttribute("boardMyhomeLikes", boardMyhomeLikes);
redirectAttributes.addFlashAttribute("isLiked", !isLiked);
// 해당 게시글상세페이지로 리다이렉트 (어디로?: myHomeSelect.jsp 여기로)
return "redirect:/board/board_myhome/myHomeSelect.do?boardMyhomeArticleNo=" + boardMyhomeArticleNo;
}
서비스
// 좋아요 여부 있는지 조회
public boolean isLiked(int boardMyhomeArticleNo, String memberId) {
return myhomeDAO.isLiked(boardMyhomeArticleNo, memberId) > 0;
}
// 좋아요 추가
public void addLikes(int boardMyhomeArticleNo, String memberId) {
myhomeDAO.addLikes(boardMyhomeArticleNo, memberId);
myhomeDAO.upLikes(boardMyhomeArticleNo);
}
// 좋아요 삭제
public void deleteLikes(int boardMyhomeArticleNo, String memberId) {
myhomeDAO.deleteLikes(boardMyhomeArticleNo, memberId);
myhomeDAO.downLikes(boardMyhomeArticleNo);
}
// 좋아요 수 조회
public int likesList(int boardMyhomeArticleNo) {
return myhomeDAO.likesList(boardMyhomeArticleNo);
}
DAO
// 좋아요 여부 있는지 조회
@Override
public int isLiked(int boardMyhomeArticleNo, String memberId)
throws DataAccessException {
Map<String, Object> params = new HashMap<>();
params.put("boardMyhomeArticleNo", boardMyhomeArticleNo);
params.put("memberId", memberId);
return sqlSession.selectOne("mapper.board.isLiked", params);
}
// 좋아요 추가
@Override
public void addLikes(int boardMyhomeArticleNo, String memberId)
throws DataAccessException {
Map<String, Object> params = new HashMap<>();
params.put("boardMyhomeArticleNo", boardMyhomeArticleNo);
params.put("memberId", memberId);
sqlSession.insert("mapper.board.addLikes", params);
}
// 좋아요 증가
@Override
public void upLikes(int boardMyhomeArticleNo)
throws DataAccessException {
sqlSession.update("mapper.board.upLikes", boardMyhomeArticleNo);
}
// 좋아요 삭제
@Override
public void deleteLikes(int boardMyhomeArticleNo, String memberId)
throws DataAccessException {
Map<String, Object> params = new HashMap<>();
params.put("boardMyhomeArticleNo", boardMyhomeArticleNo);
params.put("memberId", memberId);
sqlSession.delete("mapper.board.deleteLikes", params);
}
// 좋아요 감소
@Override
public void downLikes(int boardMyhomeArticleNo) throws DataAccessException {
sqlSession.update("mapper.board.downLikes", boardMyhomeArticleNo);
}
// 좋아요 수 조회
@Override
public int likesList(int boardMyhomeArticleNo) throws DataAccessException {
return sqlSession.selectOne("mapper.board.likesList", boardMyhomeArticleNo);
}
매퍼
<!-- 좋아요 여부 확인 -->
<select id="isLiked" resultType="int">
SELECT COUNT(*)
FROM boardMyHomeLikes
WHERE boardMyhomeArticleNo = #{boardMyhomeArticleNo} AND memberId = #{memberId}
</select>
<!-- 좋아요 추가 -->
<insert id="addLikes">
INSERT INTO boardMyHomeLikes (boardMyhomeArticleNo, memberId)
VALUES (#{boardMyhomeArticleNo}, #{memberId})
</insert>
<!-- 좋아요 수 증가 -->
<update id="upLikes">
UPDATE boardMyhome
SET boardMyhomeLikes = boardMyhomeLikes + 1
WHERE boardMyhomeArticleNo = #{boardMyhomeArticleNo}
</update>
<!-- 좋아요 삭제 -->
<delete id="deleteLikes">
DELETE FROM boardMyHomeLikes
WHERE boardMyhomeArticleNo = #{boardMyhomeArticleNo} AND memberId = #{memberId}
</delete>
<!-- 좋아요 수 감소 -->
<update id="downLikes">
UPDATE boardMyhome
SET boardMyhomeLikes = boardMyhomeLikes - 1
WHERE boardMyhomeArticleNo = #{boardMyhomeArticleNo}
</update>
<!-- 최신 좋아요 수 조회 -->
<select id="likesList" resultType="int">
SELECT boardMyhomeLikes
FROM boardMyhome
WHERE boardMyhomeArticleNo = #{boardMyhomeArticleNo}
</select>
SELECT * FROM boardMyhome
WHERE boardMyhomeArticleNo =1;
SELECT *from boardMyHomeLikes;
select * from boardMyhome;
SELECT COUNT(*)
FROM boardMyHomeLikes
WHERE boardMyhomeArticleNo = 1 AND memberId = 'hong';
-- 게시판_내집소개
CREATE TABLE boardMyhome (
boardMyhomeArticleNo number(10) primary key,
memberId VARCHAR2(16), -- FOREIGN KEY
boardMyhomeTitle VARCHAR2(20), -- 제목
boardMyhomeContents VARCHAR2(4000), -- 내용
boardMyhomeLikes number(10) default 0, -- 좋아요
boardMyhomeViews number(10) default 0, -- 조회수
boardMyhomeUpdated date default sysdate, -- 등록일
boardMyhomeHomeSize VARCHAR2(10), -- 평수 카테고리
boardMyhomeHousingtype VARCHAR2(30), -- 주거 형태 카테고리
CONSTRAINT BoardMyhome_Member_Id_FK FOREIGN KEY(memberId) REFERENCES member(memberId)
);
-- 내집소개_좋아요 여부 확인용
CREATE TABLE boardMyHomeLikes (
boardMyhomeArticleNo number(10), -- FOREIGN KEY
memberId varchar2(16), -- FOREIGN KEY
likesUpdated date default sysdate,
CONSTRAINT BoardMyhomeLikes_Article_No_FK FOREIGN KEY(boardMyhomeArticleNo)
REFERENCES boardMyhome(boardMyhomeArticleNo),
CONSTRAINT boardMyHomeLikes_Member_Id_FK FOREIGN KEY(memberId) REFERENCES member(memberId)
);