관리 메뉴

Just Do it

[개인 프로젝트] SJBoard (댓글 및 파일 업로드 게시판) 15일차 개발 일지 본문

개인프로젝트/[스프링] SJBoard 개발일지

[개인 프로젝트] SJBoard (댓글 및 파일 업로드 게시판) 15일차 개발 일지

Seojoo21 2022. 3. 25. 23:51

2022.03.25.금요일 15일차 

 

오늘은 어제 완성하지 못한 게시글 추천 기능을 완성하고 대략적인 홈 화면을 구성하였다. 

 

1.  제작 과정 

- 게시글 추천 기능 구현

 

* 로그인한 사용자만 게시글 추천 가능 

* 로그인한 사용자는 게시물당 한 번만 추천할 수 있음

* 이미 추천한 게시글일 경우 기존의 '추천' 버튼이 '추천 1'로 변경됨

* 이미 추천한 게시글 재조회 시 '추천 1' 버튼을 누르면 추천이 취소되고 원래의 '추천' 버튼으로 변경됨  

https://seojoo21.tistory.com/159

 

[SJBoard 프로젝트] 기존 게시판 기능 보완 2: 게시물 추천(좋아요) 기능 구현

맨 처음 스프링으로 게시판을 만들 때부터 생각해둔 게시물 추천 기능을 이제 구현해야겠다는 생각이 들었다. 사실 맨 처음 게시판에 추천 기능을 넣고 싶다는 생각을 했을 때는 게시물을 클릭

seojoo21.tistory.com

 

2. 발생 에러 및 해결 방법

More than one fragment with the name [spring_web] was found

https://seojoo21.tistory.com/158

 

[스프링/STS] More than one fragment with the name [spring_web] was found

1. 에러 아침에 STS를 열고 서버를 실행하는데 만난 에러. 어제까지만 해도 이상 없이 돌아가던 프로젝트였는데 갑자기 이러는 것이 이해가 되지 않았다. 이름이 [spring-web]인, 둘 이상의 fragment들

seojoo21.tistory.com

 

3.  오늘 프로젝트 진행하면서 추가로 배운 내용

1) 홈 화면에 최신 게시글과 인기 게시글을 불러오도록 하기 위해 RANK() OVER 함수와 INDEX 를 이용하여 쿼리문을 작성해 보았고 성능을 위해 INDEX를 사용한 쿼리문으로 mapper.xml을 작성하였다. 

 

https://seojoo21.tistory.com/160

 

[오라클] 상위 n개 데이터 가져오기 (RANK OVER() 함수 또는 INDEX 사용)

아래 쿼리문은 tbl_board에서 추천수와 조회수가 가장 많은 게시물을 기준으로 정렬한 테이블을 인라인 뷰로 하여 상위 5개 게시물만 가져오는 쿼리문이다. SELECT BNO, TITLE, WRITER, LIKEHIT FROM (SELECT BNO,

seojoo21.tistory.com

<!-- 11. 최신 게시물을 가져온다. -->
<select id="getRecentList" resultType="com.seojoo21.domain.BoardVO">
<![CDATA[
	select /*+index_desc(tbl_board pk_board)*/ bno, title, writer, regdate from tbl_board where rownum <= #{amount } 
]]>
</select>

<!-- 12. 인기 게시물을 가져온다. -->
<select id="getLikeHitList" resultType="com.seojoo21.domain.BoardVO">
<![CDATA[
	select bno, title, writer, likehit, viewhit
	from
	(select /*+index_desc(tbl_board idx_board_like)*/ 
	bno, title, writer, likehit, viewhit from tbl_board)
	where rownum <= #{amount }
]]>
</select>

 

2) 회원 탈퇴 시 자동 로그아웃이 되지 않아 회원 정보가 그대로 세션에 남아있는지 로그인 한 회원에게만 보이는 상단의 메뉴가 그대로 유지된 채 로그인 전 초기 메뉴로 변하지 않았다.

 

처음 회원 탈퇴 메서드를 컨트롤러에 구현할 때 부터 세션을 비우기 위해 session.invalidate() 를 사용하고 있었고 STS 콘솔창에서 로그를 확인했을 때도 회원 탈퇴 시 세션이 만료되는 것을 확인했기 때문에, DB에서조차 탈퇴 처리가 되어 데이터가 완전히 사라진 사용자의 정보가 홈 화면으로 리다이렉트 또는 일반 이동되었을 때 계속 유지되는 것이 이해되지 않았다.

 

결국 문제는 회원 탈퇴 시 자동 로그아웃이 되지 않아서 발생하는 것이었는데, 이를 해결하기 위해 컨트롤러에서 회원 탈퇴 처리 메서드를 구현할 때 반드시 아래 코드 한 줄을 넣어야했다. 

SecurityContextHolder.clearContext();

이 코드를 추가 후 다시 테스트한 결과 회원 탈퇴 시 로그아웃도 자동으로 처리되어 상단 메뉴가 로그인 전 초기 메뉴로 이상 없이 변하는 것을 확인할 수 있었다. 스프링 시큐리티 기본 아키텍쳐에 대한 이해가 한참 부족한 것 같다. 제대로 공부해야겠다.