🚩기술 스택
🙌FrontEnd : HTML / css / JavaScript
🙌BackEnd :
- OS : Window
- Development Tool : Ecliplse, Apache-Tomcat, Sql Developer
- Framework : Spring,mybatis, bootstrap
- Language/Skills : HTML, CSS, Java Script, JAVA, SQL, JSP & Servlet, jQuery
- DB : Oracle
🙌협업 도구 : Discode / git + gitHub
😎GitHub : [프로젝트 깃허브 주소 연결]
전체적으로 디테일 페이지를 담당하였으며,
담당한 것은 📕로 표시 하였습니다.
📕 Exerd: 팀원 전원 참여
📕 유저 페이지 : 회원가입, 로그인, 로그아웃, 회원정보수정
📘 main(index) : 서평 랜덤 재생
📘 내서재 : 내서평
📕 취향저격 : my취향, 좋아요한 서평, 관심가는 책(북마크)
📘 플레이리스트 : 카테고리 별 폴더 리스팅
📕 플레이리스트 상세페이지 : 서평 추가 및 삭제, 폴더 좋아요 기능, 사이트 전체 서평 검색 및 추가
📘 서평쓰기
📕 책 상세페이지 : 해당 책 데이터 가져오기, 해당 책의 서평 최신순/인기순 리스팅, 서평 수정/삭제, 서평 페이징, 서평 좋아요 기능
: session에 로그인 정보를 넣어 사용하고, 로그아웃 시에는 session 정보를 삭제한다.
HttpSession.setAttribute("authUser", authUser);
httpSession.removeAttribute("authUser");
httpSession.invalidate();
4) 세션 값 삭제하기
removeAttribute(String name)
removeAttribute 메서드로 name 값에 해당하는 세션 정보를 삭제할 수 있다.
invalidate()
invalidate로 모든 세션 정보를 한 번에 삭제할 수 있다.
읽기 + 수정
: 회원정보수정 버튼 클릭 ---(세션에 있는 유저 고유 번호 전달)----> 화면 로드시 기존의 데이터 가져오기 ----> 데이터 수정 후 수정 요청 -----> update 쿼리로 데이터 수정
폼에 있는 데이터 받기 -> 데이터 검증 -> 데이터베이스 insert 저장
🔗 페이지로 넘어오는 경로
1. main 서평 컨텐츠
2. 책 제목
📖 핵심 기능
- 책 데이터 관련 기능
☑️ 관심가는 책 (북마크 기능)
☑️ 해당 책 데이터 가져오기 (제목, 저자, 작성된 서평 누적 개수)- 서평 관련 기능
☑️ 해당 책의 서평 최신순/인기순 리스팅 (R)
☑️ 서평 수정/삭제 (U/D)
☑️ 서평 페이징
☑️ 서평 좋아요 기능
Endpoint url 요청 (get)
http://localhost:8088/bookproject/bookdetail?bookNo=9791166686603&userNo=1
Endpoint url 요청 (get)
http://localhost:8088/bookproject/bookdetail?bookNo=9791166686603&userNo=1&markresult=true
북마크 추가 혹은 삭제 :
user고유 번호와 해당 책 번호 현재 북마크 상태를 인자값으로 넘겨 DB에 insert/delete를 해준 뒤,
성공적으로 작용했을 경우 1의 값을 반환 받아
if문을 통해 String에 false값(추가의 경우 화면이 -로 되어야해서) 혹은 true(삭제의 경우 화면이 +로 되어야해서) 값을 반환반은 뒤
js로 화면을 그려줍니다.
로딩시 DB(테이블 book_info)에서 해당 bookNo로 데이터를 가지고온다.
-> 책 제목, 작가, 책 커버 url, 알라딘 책 url, 서평 누적수
👉 서평 누적 수
: 서평 테이블과 join(book_no)하여 count(book_no)로 서평 누적 갯수를 가져온다
(Query)
select count(review_no)
from books, review
where books.book_no = review.book_no
and books.book_no = book_no;
리스트 출력은 하단의 서평 데이터 리스트만 변경될 수 있도록 ajax로 리스트를 생성해줬습니다.
<<!-- 해당 책 서평 리스트 출력(인기순) -->
<select id="reviewListBest" parameterType="String" resultType="BookdetailVo">
<![CDATA[
select rownum rn,
ot.book_no bookNo,
ot.book_title bookTitle,
ot.review_no reviewNo,
ot.review_content reviewContent,
to_char(ot.review_date, 'yyyy/mm/dd') reviewDate,
ot.style_no styleNo,
ot.emo_name emoName,
ot.user_no userNo,
ot.nickname nickname,
NVL(ot.likecnt,0) likecnt
from (select rt.book_no,
rt.book_title,
rt.review_no,
rt.review_content,
rt.review_date,
rt.style_no,
rt.emo_name,
rt.user_no,
rt.nickname,
rt.likecnt
from (select bt.book_no,
bt.book_title,
bt.review_no,
bt.review_content,
bt.review_date,
bt.style_no,
bt.emo_name,
bt.user_no,
bt.nickname,
lt.likecnt
from(select b.book_no,
b.book_title,
r.review_no,
r.review_content,
r.review_date,
s.style_no,
e.emo_name,
u.user_no,
u.nickname
from books b, review r, style s, emotion e, users u
where b.book_no = r.book_no
and r.style_no = s.style_no
and s.emo_no = e.emo_no
and r.user_no = u.user_no
and b.book_no = #{bookNo}) bt,(select review_no,
count(review_no) likecnt
from review_user
group by review_no) lt
where bt.review_no = lt.review_no(+)) rt
order by rt.likecnt asc) ot
]]>
</select>
📖 핵심 기능
- 플레이리스트 관련 기능
☑️ 플레이리스트 좋아요
☑️ 페이징- 모달창 서평 관련 기능
☑️ 키워드 서평 검색
☑️ 플레이리스트 실시간 서평 추가
☑️ 페이징
: ❗️(본 플레이리스트를 좋아요를해서 가지고 오는 경우 플레이리스트를 그대로 복사하는것이 아닌 원본을 공유하는 것이기 때문에 그안의 서평은 플레이리스트 생성자만 추가, 수정, 삭제가 가능하도록 해야한다.)
if(keyNum.keyCode == 13){
console.log('엔터!');
//검색 내용 요청
getSearch();
}
(Query)
select r.review_content reviewContent,
r.review_no reviewNo,
e.emo_name emoName,
b.book_title bookTitle,
b.book_no bookNo,
pr.playlist_no playlistNo
from review r, style s, emotion e, books b, playlist_review pr
where r.style_no = s.style_no
and s.emo_no = e.emo_no
and b.book_no = r.book_no
and r.review_no = pr.review_no
and (r.review_content like '%'||#{param}||'%'
or b.book_title like '%'||#{param}||'%'
or e.emo_name like '%'||#{param}||'%'
)
: 추가시 ajax요청 -> 응답 받고 모달창이 닫히기 전에 모든 모달 데이터를 지워준 뒤 모달창을 닫는다.
(모달창은 잠깐 숨겨놓는것이기 때문에)
클릭 이벤트
를 통해 서평 체크박스의 css 변경을 해준다 (체크박스 선택, 취소 동일)//.glyphicon-unchecked -> glyphicon-check
$(this).attr('class','glyphicon glyphicon-unchecked btn-check')
$('#review-add').modal('hide');
$('#reviewAll').empty();
서버
서평 리스트 페이징 구현(모달창, 플레이리스트 폴더 동일)
: 페이징시 응답 받을 데이터
(Query)
정렬 -> rownum -> select
select se.rn rn,
se.reviewNo reviewNo,
se.userNo userNo,
se.bookNo bookNo,
se.styleNo styleNo,
se.reviewContent reviewContent,
se.reviewDate reviewDate,
se.emoName emoName,
se.bookTitle bookTitle,
se.playlistNo playlistNo
from (select rownum rn,
fr.reviewNo,
fr.userNo,
fr.bookNo,
fr.styleNo,
fr.reviewContent,
fr.reviewDate,
fr.emoName,
fr.bookTitle,
fr.playlistNo
from (select r.review_no reviewNo,
r.user_no userNo,
r.book_no bookNo,
r.style_no styleNo,
r.review_content reviewContent,
r.review_date reviewDate,
e.emo_name emoName,
b.book_title bookTitle,
pr.playlist_no playlistNo
from review r, style s, emotion e, books b, playlist_review pr
where r.style_no = s.style_no
and s.emo_no = e.emo_no
and b.book_no = r.book_no
and r.review_no = pr.review_no
order by review_date desc) fr) se
where rn >= 1
and rn <= 5
👉 사용자 서평 플레이리스트
👉 타인의 서평 플레이리스트
1 플레이리스트 서평 추가
2 좋아요 기능
3 페이징
공통 사용되는 자원이나 코드의 경우(모달창) 따로 개별적으로 파일화하여 각각 분리시켜주는 것이 좋은지
아니면 한 파일에 정리해서 사용하는 것이 좋은 방법인지 고민해봤다.
알라딘 api 사용시 CORS CORD 에러
데이터베이스에서 계산할 수 있는 로직은 데이터베이스에서 전부해서 가져오는것이 좋은지
데이터베이스에서는 값만 가지고오고 자바에서 계산을 하는것이 좋은지 어떤것이 성능 최적화가 될 수 있는지 고민해봤다.
깃허브 브랜치