Learn/KH정보교육원

[KH정보교육원 당산] 64일(Spring_Simple_Board // 상세보기,수정,삭제,검색)

Dahoon06 2021. 6. 12. 15:01
728x90
반응형

전 시간에 글을 작성해서 리스트목록 출력까지 했다.

 

오늘은 글 제목을 클릭했을 때 조회수 증가와 함께 해당 글을 출력할 것이다.

 

list.jsp의 게시글의 제목부분

<td>
  <a href="retrieve.do?num=${board.num }">${board.title }</a>
</td>

retrieve.do를 호출하면서 같이 num이라는 파라미터명으로 해당 글의 번호를 파라미터값으로 보내준다.

 

** 어제했던 코드를 JSTL을 이용하여 바꿔서 번호부분의 코드가 다르다.

 

controller패키지 내의 RetrieveActionController 클래스 추가

사용자로부터 외부의 입력을 받지 않기 때문에 단순히 Spring이 제공하는 Controller를 구현 받는다.

 

BoardDAO에서 해당 글을 조회 쿼리 추가

//해당 글 조회
	public BoardDTO detailBoard(int num) {
	String sql = "SELECT * FROM springBoard WHERE num = ?";
	BoardDTO dto = new BoardDTO();
	try {
		String sql2 = "UPDATE springBoard SET readcnt = readcnt + 1 WHERE num = ?";
		Connection conn = ds.getConnection();
		PreparedStatement pstmt = conn.prepareStatement(sql2);
		pstmt.setInt(1, num);
		pstmt.executeUpdate();
		//다시 초기화
		pstmt = null;
		
		pstmt = conn.prepareStatement(sql);
		pstmt.setInt(1, num);
		ResultSet rs = pstmt.executeQuery();
		
		if(rs.next()){
			dto.setNum(rs.getInt("num"));
			dto.setAuthor(rs.getString("author"));
			dto.setTitle(rs.getString("title"));
			dto.setContent(rs.getString("content"));
			dto.setWriteDay(rs.getString("writeDay"));
			dto.setReadCnt(rs.getInt("readCnt"));
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	return dto;
	
}//detailBoard END

조회수 증가 쿼리를 따로 메서드를 만들지 않고, 글 조회 메서드 내부에 쿼리문 생성했다.

 

RetrieveActionController로 돌아가서 해당 글을 조회해서 dto에 담아 줬으니 다시 ModelAndView의 객체를 생성해서

페이지전환과 조회한 데이터를 변수에 담아 전달한다.

 

board-servlet.xmlretrieve 컨드롤러 추가

 

<!-- 상세보기 -->
	<bean name="/retrieve.do" class="board.controller.RetrieveActionController">
		<property name="dao"> 
			<ref bean="boardDAO" />
		</property>
	</bean>

 

retrieve.jsp(해당 글 목록)

 

 

 

 

 

 

 

 

 

 

 

 

해당 페이지에서는 글을 수정하거나 삭제 또는 다시 목록으로 돌아갈것이다.

 

글 수정 : update.do => 사용자로부터 입력을 받기때문에 글작성때와 같이 Command 패키지 내에 BoardUpdateCommand 클래스를 추가했다. 정보 수정은 제목과 본문만 입력받는다.

또한 UpdateActionController 클래스를 생성하는데 이때 외부로부터 데이터를 입력을 받기 때문에 인터페이스 구현이 아닌

AbstractCommandController를 상속 받는다.!!

** Command 패키지의 역할
BoardDTO , BoardCommand 분리 해놓은 이유
=> ex) 사용자가 입력하는 값 5개 , 테이블의 필드 10개 중 사용자가 입력하는 값이 5개, 기본값 설정이 되어있는 필드 5개

만약 동시접속자가 10000000명일 경우 불필요한 5개의 변수에 대한 메모리 낭비가 일어나기때문이다.
따라서 불필요한 변수를 줄여 메모리를 아끼기위함.

 

글 삭제 : delete.do => Spring이 제공하는 Controller구현 받는다.

글 목록 : list.do => 다시 게시글 리스트로 이동

 

먼저 글 수정 부분

BoardUpdateCommand => title과 content의 getter/ setter 생성

UpdateActionController

게시글 작성했을때의 controller와 같다.

command로 데이터가 들어오는데 이때 command는 Object형태로 값이 들어오기때문에 형변환 필요!!!

 

board-servlet에 UpdateActionController 추가

<!-- 글 수정 -->
	<bean name="/update.do" class="board.controller.UpdateActionController">
		<property name="dao">
			<ref bean="boardDAO" />
		</property>
		<property name="commandClass" value="board.command.BoardUpdateCommand"></property>
	</bean>

commandClass를 사용하기 때문에 해당 값도 등록해준다.

 

BoardDAO에 글 수정 쿼리 추가

//글 수정
	public void updateBoard(BoardUpdateCommand data,String num) {
		String sql = "UPDATE springBoard SET title=?, content=? WHERE num = ?";
		
		try {
			Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, data.getTitle());
			pstmt.setString(2, data.getContent());
			pstmt.setInt(3, Integer.parseInt(num));
			
			pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

수정된 값을 BoardUpdateCommand의 객체를 생성하여 전달받으므로 

수정이 완료되면 return new ModelAndView("redirect:/list.do");을 통해서 다시 게시글 목록으로 이동

 

삭제도 수정이랑 똑같다.

BoardDAO에 쿼리 추가

//글 삭제
	public int deleteBoard(String num) {
		String sql = "DELETE FROM springBoard WHERE num = ?";
		int result = 0;
		try {
			Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, num);
			
			result = pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

DeleteActionController 클래스 생성 및 board-servlet에 컨트롤러 등록

컨트롤러 등록

<!-- 글 삭제 -->
	<bean name="/delete.do" class="board.controller.DeleteActionController">
		<property name="dao">
			<ref bean="boardDAO" />
		</property>
	</bean>

 

 

마지막으로 추가할 것은 입력된 값을 통하여 게시물 찾는것!!

이와 같이 작성자와 제목을 선택받아 게시글을 조회

 

list.jsp <body> 태그 내부

 

select태그를 만들어 주었고 작성자와 제목을 선택 받을수 있게.

따라서 넘어가는 파라미터명 : searchName => 파라미터값 : author 또는 title

                         파라미터명 : searchValue => 파라미터값 : 사용자로부터 입력받는다.

 

 

SearchActionController

넘어오는 파라미터값이 2개니까 값을 받는 변수도 2개.

board-servlet에 컨트롤러 등록

<!-- 글 검색 -->
	<bean name="/search.do" class="board.controller.SearchActionController">
		<property name="dao">
			<ref bean="boardDAO" />
		</property>
	</bean>

 

BoardDAO에 해당 게시글을 조회하는 쿼리 생성

//글검색
	public ArrayList<BoardDTO> searchList(String searchName,String searchValue) {
		String sql ="select * from springBoard where "+ searchName +" like '%" + searchValue + "%'";
		
		ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
		
		try {
			Connection conn = ds.getConnection();
			PreparedStatement pstmt = conn.prepareStatement(sql);
			
			ResultSet rs = pstmt.executeQuery();
			rs = pstmt.executeQuery();
		
			while(rs.next()) {
			BoardDTO dto = new BoardDTO();
			
			dto.setNum(rs.getInt("num"));
			dto.setAuthor(rs.getString("author"));
			dto.setTitle(rs.getString("title"));
			dto.setContent(rs.getString("content"));
			dto.setWriteDay(rs.getString("writeDay"));
			dto.setReadCnt(rs.getInt("readCnt"));
			
			list.add(dto);
		}
		} catch(Exception e){
			e.printStackTrace();
		}
		return list;
	}

 

** 혼자 할때는 like연산자를 생각 못했다...

if()문을 통하여 author의 값으로 값이 들어오면 해당 쿼리를 아니면 그에 맞는 쿼리를 이렇게 2개의 쿼리를 만들어서 했는데

like를 사용하여 하나의 쿼리로 2가지의 일을 할 수 있게한다.

 

***   like연산자 한번 더 정리

SQL문에서는 비교 '='을 대신하여 like연산자를 사용한다.(특정 문자를 찾을때 사용되는 연산자)

구문 :  where 필드이름 like 문자열패턴 

위의 예제)"SELECT * FROM springBoard WHERE "+ searchName +" like '%" + searchValue + "%'";

serachName과 searchValue 변수 사용

 

%검색어 => 검색어로 끝나는 것 찾는거


%검색어% => 검색어를 포함하는 것을 찾음


검색어% = 검색어로 시작하는 것을 찾음

 

=> searchValue를 포함하는 게시글 조회

 

검색된 데이터를 마찬가지로 ModelAndView를 통하여 전달

 

완료!!

 

SpringFramework의 흐름을 알아보기 위한 예제였다.

다음주부터 좀 더 자세히 Spring에 대하여 공부한다.


728x90
반응형