JSP/개념정리

Set 기법 적용

Itchild 2024. 4. 29. 12:00
728x90
반응형

 

1:N 관계면 다 사용 가능

작업중 한번쯤은 만나게 되는 작업 유형이라서 알아둘 필요가 있다 !


SET은 뭔가의 묶음

BoardSet - 보드와 대댓글 배열리스트 모아 놓은것

 

댓글하나에 대댓글 여러개를 묶어서 배열 리스트에 넣는다.

 

While 안에 While → 게시글에 대한 댓글 및 대댓글이 필요하기 때문에

보고 있는 데이터의 대댓글을 SQL에 넣어주는 구조

 

FrontController의 main.do 로 이동

 

MainAction 으로 이동

FrontController 의 흐름 및 적용은 아래 링크를 참고 !

https://tjdals9219.tistory.com/215

 

MainAction 으로 이동하면

첫번째 박스부터 해석 → 메인으로 갈거야 데이터를 가진 상태로

 

BoardSet의 배열리스트 datas 는 selectAll 에서 인자가 2개 였다.

count 인자 - 게시글을 일정 갯수 만큼만 볼건데 이만큼만 볼거다 갯수

BoardVO는 필요없어서 null이고 count는 두개의 글만 보겠다. 2개


 

 
 

 

제네릭이 BoardSet이기 때문에 v의 타입은 BoardSet 이다.

BoardSet 이라는 VO를 보면 BoardVO와 Reply 배열 리스트가 있다.

v의 board 파트를 "board"라고 부를거고

v의 대댓글 모음(v.rdatas) 을 rdatas라 할거야

----> 이렇게 줄이는 이유 ! 줄이지 않으면 ${datas.board.bid} , ${datas.rdatas.rid} 라고 복잡해진다 !

 

c:set 자주 등장하는 기법 멤버변수 접근을 줄이기 위한 연산자로 많이 활용 된다.

jsp 새로운 변수 생성 하는것 보단 변수명을 줄이기위한 목표로 사용 됨

 

위의 식은 이중 for 문으로 게시글 안에 댓글들 중 하나의 댓글 안에

여러개의 대댓글 구조를 표현한 모습이다 !

 

 

✔️ 더보기 기능

 

더보기 버튼을 누르게 되면

2 , 4 , 6 으로 늘어날 예정

 

a태그로 더보기 기능을 할 예정

---> main.do 로 갈건데 어떻게 가 ? 카운트를 = ${기존의 count+2 }"

기존 카운트를 메인을 볼때 보내줘야 된다는 뜻

 

기존의 카운트 값에 더하기 2 한것만큼을 새로운 카운트 파라미터의 값에

EL표현식 내부가 연산 가능 공간이라 +를 EL표현식 내부에 넣어야 한다.

 

나 main 볼거야 기존의 카운트 값에 2를 더한 만큼만 볼게

에 올때 카운트가 있어야 된다.

메인 액션 할때 앞으로 어떻게 해 ? 카운트도 줘야함

카운트는 파라미터로 받는다

"count"가 String 이라 int 로 형변환

 

 

if(count == null || count.isEmpty() || count.isBlank() || count.equals("")) {

count="2";} // null 일 수 있는 조건은 다 막아주었다.

// (null 이니? || 비어있니? || 빈칸이니? || "" 로 되어있니?)

count 더보기 구현시 무조건 댓글은 2개 (내가 정하는 것 : 갯수는 본인이 정하는 값으로) !!

 

 

 

★ 다시 정리

 

1. view 에서 부터 출발

내가 main.jsp에서 EL표현식으로 count를 쓰려하면 request에 있었어야함

마찬가지로 count도 있어야 함

이 count는 DAO 개수볼 때 사용하는 애래.

 

그 count를 받아와야 되네 ? 몇개 볼지 알아야 하니까

 

2. 500 에러뜸 로그 보자

Number Format Exception ( null은 Number가 될 수 없다. )

count를 안주셨는데 어떻게 만들어요 ,,, 라는 의미

여기서 인덱스에서 카운트를 줘야함 기본적으로 2 개를 볼거라고 말해줌

 

메인에서 더보기라는걸 하려면

EL표현식 때문에 카운트를 줘야함 카운트 DAO 에서 쓰는 애

그럼 파라미터가 있어야 되는데 ? 어 그러면 인덱스에서 기존에 줄게

 

- 글 있는거 까지만 나오는데 url은 계속 올라감 바뀜 (이슈)

 

내가 더볼글이 없다면 더보기 지우기 if문에 넣는다

if(너 글 더있어 ? 없어 ?) { 그러면 안본다 }

페이지 네이션으로 검색하기 !!!!!!!

 

메인으로 가기 누르면 또 null이 뜸

다쫓아다면서 count 를 넣을 것인가,,

유지보수가 힘들어진다. 이런 것이 하드코딩의 폐해

어떻게 할거냐면 메인 액션에서

혹시 if ( 카운트가 null이니 ? 혹은 카운트가 비어있니 혹은 카운트가 블랭크 니 혹은 카운트가 이퀄 "" 이니 )

--> // (null 이니? || 비어있니? || 빈칸이니? || "" 로 되어있니?)

 

비어있으면 카운트를 2로 하라

 

제일 완벽하게는 트라이 캐치까지 묶기

그때만 넘어가는게 아니라 앞으로 브라우저를 이렇게 바꿀 수도 있고 전부다 할 수 있는건 다 넣어주자

count == null 이 제일 앞에 있어야 한다.

null 체크시 항상 null 맨앞으로 와있어야 한다.

 

인덱스에 하드코딩 하지않고

회원가입을 할 때 새창을 띄워서도 활용 할 수 있다는 점


댓글 달기

 

내 대댓글 다음에 글을 작성할 수 있도록 그 다음에 폼태그가 들어갈 수 있게

form 태그 insert ReplyAction이 있어야 되네

<%@ tag language="java" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ attribute name="type" %>
<%@ attribute name="bid" %>

<c:if test="${empty mid}"> // 로그인이 안되어있을때
	<input type="text" placeholder="내용을 작성하려면 로그인하세요." disabled size="50">
</c:if>

<c:if test="${not empty mid}"> // 로그인이 되어있을때 
	<c:choose>
			<c:when test="${type == 'board'}"> // 댓글을 쓰려고 할때
					<form action="insertBoard.do" method="post">
						<input type="text" name="mid" value="${mid}" readonly>
						<input type="text" name="bcontent" required placeholder="내용을 작성하세요.">
						<input type="submit" value="글 작성하기">
					</form>
			</c:when>
		
			<c:when test="${type == 'reply'}"> // 대댓글을 쓰려고 할때
					<form action="insertReply.do" method="post">
						<input type="text" name="mid" value="${mid}" readonly>
						<input type="hidden" name="bid" value="${bid}">
						<input type="text" name="rcontent" required placeholder="댓글을 입력하세요.">
						<input type="submit" value="댓글 작성하기">
					</form>
			</c:when>
	</c:choose>
</c:if>
 

<커스텀 태그 활용 > 댓글인지 , 대댓글인지 나눈다.

 

${empty mid} ,${not empty mid} 조건으로 1차 나눔 (로그인 유무)

로그인이 되었다면 → ${type == 'board'} , ${type == 'reply'} 조건으로 2차 나눔 (댓글인지 , 대댓글인지)

컨트롤러에서 넘겨 받는 값을 생각하자

view 에서 폼태그에 mid , bid (사용자가 볼 필요 없으니 히든으로 쓴다 ${ 현재 보드의 bid }) , content


choose when

로그인 했니 ?? 현재 상태가 글이야?

              댓글이야 ?
 

 

태그를 써서 응집도!!!!!!를 높였다.

작성과 관련된 뷰는 다 이 페이지 이 태그에 있다.

 

글인지 댓글 인지를 외부로 부터 받아와야 하기 때문에

태그 안에 상단에 선언

type 을 받아온다.

쟤를 쓰려면 앞으로 type을 같이 밀어 넣어 줘야 한다.

이제 type을 같이 써줘야 한다.

 

<커스텀 태그 안 >

- 현재 타입이 Board 니 ?

 

- 현재 타입이 Reply 니 ?


<main.jsp 안>

이제 이건 type = board

type = reply 인지

 

태그에 bid 알아야 하니까 전달 해주고

응집도를 높이기 위해 하나의 태그에 사용 된다.

 

그런데 ! bid 를 이 커스텀 태그를 쓰려면 받아와야 한다.

이 bid는 메인 페이지 에서 사용한거고 커스텀은 다른 페이지 격 이라서 보내줘야 쓸 수 있다.

그래서 메인에서 값을 선언을 해준다.

 

 

✔️ 좋아요 기능 넣기

 

글 옆에 좋아요를 넣을 예정

하트를 에이태그로 단다.

 

좋아요 관련 fav.do

좋아요는 update 이다

 

static final private String SQL_UPDATE_FAV =

"UPDATE BOARD SET FAVCNT=FAVCNT+1 WHERE BID=?"

MySQL 업데이트를 하나 더 만들어야함

fav 에 대한 업데이트

 

이로서 UPDATE 키워드가 2개가 되었으므로 서치 키워드 써서 구분하기 !!

ex) 조건 .equals 업데이트

ex) 조건 .equals fav

 

 

이제 fav Action 갔을때

bVO.setCondition ( "fav") 이다.

라고 알려줘야 한다.

fav 할때 bid 가 필요하다.

 

 

view 로 가면 bid 넣어서 줘야지 !!!

view 는 bid=${board.bid}

 

 

★ 좋아요 기능 흐름정리

 

  • 파트를 버튼화 fav 액션

궁극적으로 업데이트라 컨디션 추가

사용자로 부터 받아왔어야만 하는 사용자 bid 만 부탁

 

  • 좋아요 카운트도 만들자

${board.favcnt }

 

  • 회원이 한번만 하트를 누르게 하려면

어떤 회원이 어떤 거에 하트를 누르게 되었는지

테이블이 있어야 한다.

 

 

728x90
반응형