🟩 오늘 작업들
- (BE) 피드 화면 컨트롤러 - 파라미터로 값 받도록 하기
- (DB) 조인으로 인해 발발된 피드 테이블 처리유무와 댓글, 좋아요, 북마크 설계 정리
- (FE) 피드 상세 아이콘 추가 + 버튼 디자인 수정 & css 구현
- (FE) 디테일 화면에 신고 아이콘 넣기
- (DB) 댓글, 좋아요 테이블 2개로 분리
- (DB) 피드테이블 참조하는 것들을 미션로그로 참조하도록 하기: report 테이블만 수정함 (PK아이디 생성하고 기존 복합키들은 일반 FK로 변환)
- (DB) 미션로그에 속성추가 - 공개/비공개
- (FE) 탈퇴 팀원이 맡던 부분 확인하기 (공지사항 리모델링)
- (DB) 조인을 위한 쿼리문 연습
🟩 경로변경에서 파라미터값 검증으로 컨트롤러 변경
목록에서 단체미션/개인미션을 클릭할때마다 데이터베이스 값이 바뀌어서 나와야 하는데, 처음에는 /team과 /personal로 /feed의 하위경로를 나누어서 구현했다가, 한 페이지 내에서 파라미터에 따라 둘로 나눠지는게 맞는것 같아 (테이블에 팀이냐 아니냐에 따라서 0,1 (tiny int)로 나누어져 있다) 구조를 바꿔봤다.
이렇게하면 단점이, 처음 접속할때부터 /feed/list?s=0 이렇게 파라미터까지 붙여서 접속해야만 한다.
@Controller
@RequestMapping("/feed")
public class FeedController {
@Autowired
private FeedService service;
@RequestMapping("list") //파라미터 값을 받아서 변수로 처리
public String team(Model model, @RequestParam String s) {
int isSolo = Integer.parseInt(s);
List<FeedView> list = service.getListBySolo(isSolo);
model.addAttribute("list", list);
System.out.println(list);
return "feed/list";
}
// @RequestMapping("personal") // 경로를 두개로 나눴을때는 파라미터 전달값을 고정으로 처리함
// public String personal(Model model) {
// List<FeedView> list = service.getListBySolo(1);
// model.addAttribute("list",list);
// System.out.println(list);
// return "feed/list";
// }
🟩 @RequestParam 기능 활용하기
어노테이션에 대해 더 알고싶어서 찾아보다가, 필수값 설정 & 기본값 설정이 가능하단걸 알게 됐다!
[Spring] @RequestParam 사용법
스프링에서는 Http 요청 파라미터 값을 편리하게 사용하게 해주는 @RequestParam을 지원한다. HttpServletRequest의 request.getParameter의 기능과 동일하다고 보면 된다. @RequestParam 사용법 @ResponseBody @RequestMappi
dangdangee.tistory.com
@RequestMapping("list")
public String team(Model model, @RequestParam(required = false, defaultValue = "0") String s) {
int isSolo = Integer.parseInt(s);
List<FeedView> list = service.getListBySolo(isSolo);
model.addAttribute("list", list);
System.out.println(list);
return "feed/list";
}
이렇게 필수값 여부는 false로 두고 파라미터가 있을때만 인식하도록 하되, 기본값을 0으로 설정해두면 그냥 'list'로 접속했을때도 파라미터 0 에 해당하는 데이터가 뽑혀나오므로 위에서 내가 고민한 부분 (무조건 list?s=0으로 접속해야 한다)이 해결된다!!!!!
🟩 쿼리문 연습
🔥 좋아요 (미션로그)
-- 좋아요 카운트한 데이터
select *,count(ll.mission_log_id ) like_count
from mission_log ml
left join log_like ll
on ml.id = ll.mission_log_id
group by ml.id ; -- 그룹을 잡아줄때는 주인공의 아이디당으로 잡히도록
-- 전체데이터
select * from mission_log ml
left join log_like ll on ml.id = ll.mission_log_id;
-- 기존 뷰에 좋아요 left outer join
select * ,count(ll.mission_log_id) like_cnt
from mission_log_view mlv
left join log_like ll
on mlv.m_log_id = ll.mission_log_id
group by mlv.m_log_id;
-- 기존 뷰에 좋아요와 댓글 left outer join
select cl.*, count(lc.mission_log_id) comment_cnt
from
(select * ,count(ll.mission_log_id) like_cnt
from mission_log_view mlv
left join log_like ll
on mlv.m_log_id = ll.mission_log_id
group by mlv.m_log_id) cl
left join log_comment lc
on cl.m_log_id = lc.mission_log_id
group by cl.m_log_id;
🔥 댓글 (미션로그)
-- 댓글은 댓글과 대댓글까지 봐야하기 때문에 전체목록으로 조회해야 할 때가 있을수도 있다
-- group by조건을 하고 전체를 뽑을 경우 대댓글이 목록에서 가려질 수 있음 !
select * from mission_log ml
left join log_comment lc
on ml.id = lc.mission_log_id;
-- 카운트는 댓글테이블의 로그 아이디를 기준으로 하므로 대댓글까지 포함해서 개수가 세진다
select *,count(lc.mission_log_id) comments from mission_log ml
left join log_comment lc
on ml.id = lc.mission_log_id
group by ml.id;
-- 일부 속성과 댓글만 출력
select ml.contents, ml.img,count(lc.mission_log_id) comments from mission_log ml
left join log_comment lc
on ml.id = lc.mission_log_id
group by ml.id;
🔥 북마크 조회 (북마크는 '미션'을 북마크 하고 북마크를 한 회원의 아이디가 출력된다)
select * from mission_log_view mlv
left join bookmark b
on mlv.mission_id=b.mission_id;
🔥 좋아요와 댓글 개수를 구한 뷰+ 미션번호별 북마크한 사람들 리스트를 출력
select cnt_c.*,b.mission_id mission,b.member_id i_bookmarked from
(select cl.*, count(lc.mission_log_id) comment_cnt
from
(select * ,count(ll.mission_log_id) like_cnt
from mission_log_view mlv
left join log_like ll
on mlv.m_log_id = ll.mission_log_id
group by mlv.m_log_id) as cl
left join log_comment lc
on cl.m_log_id = lc.mission_log_id
group by cl.m_log_id) as cnt_c
left join bookmark b
on cnt_c.mission_id = b.mission_id
group by cnt_c.m_log_id,i_bookmarked
order by m_log_id;
🔥 일단 뷰로 만들어둔 기존뷰+좋아요 & 댓글 개수
create view mission_log_view2 as
select cl.*, count(lc.mission_log_id) comment_cnt
from
(select * ,count(ll.mission_log_id) like_cnt
from mission_log_view mlv
left join log_like ll
on mlv.m_log_id = ll.mission_log_id
group by mlv.m_log_id) cl
left join log_comment lc
on cl.m_log_id = lc.mission_log_id
group by cl.m_log_id;
🔥 맞을지 모르겠지만 북마크를 이렇게 이해해야할까?
: 좋아요 세는 법만 배우고 on,off 따지는 법을 아직 배우질않아서 join하며 고민해봤다.
좋아요 배울때 해당 메뉴 아이디와 회원 아이디만 속성값으로 갖고 있었는데, 회원아이디==내 아이디일경우만 좋아요가 표기된 모습으로 노출시키는 조건리스트라 생각했음.
select cnt_c.*,b.mission_id mission,b.member_id i_bookmarked from
(select cl.*, count(lc.mission_log_id) comment_cnt
from
(select * ,count(ll.mission_log_id) like_cnt
from mission_log_view mlv
left join log_like ll
on mlv.m_log_id = ll.mission_log_id
group by mlv.m_log_id) as cl
left join log_comment lc
on cl.m_log_id = lc.mission_log_id
group by cl.m_log_id) as cnt_c
left join bookmark b
on cnt_c.mission_id = b.mission_id
order by m_log_id;
다만 이렇게 했을때, 미션로그 아이디를 기준으로 리스트를 받아오면 1이 3개, 2가 3개인데, 그럼 화면에서도 세번씩 출력되니깐 문제가 있지않을까?싶어짐. 좋아요도 개수만 출력하면 되긴하지만 내가 좋아요 했냐 안했냐에 따라 화면에 뜨는 색이 달라질텐데, 어떻게 해야할지 빨리 배워보고싶다.
'😵 ~23.11.10 > ✨ Prj.BuildDiary' 카테고리의 다른 글
추석 연휴 part 3 :: 회원가입 플로우 완, 공지사항 리스트&상세 완 (0) | 2023.10.03 |
---|---|
추석 연휴 part 2 :: 회원가입 ▶ db로 insert 하기 그리고 오류들. (0) | 2023.10.03 |
[BE] 데이터 조인하기 1차 (Feed) & 오류 정리 (0) | 2023.09.26 |
[FE] 세부 디자인 조정 중 (0) | 2023.09.24 |
[publishing] 와 반응형 와...... feed 절반정도 완성 (1) | 2023.09.18 |