Programming/스프링(spring) - Enterprise

스프링(spring)/ 게시판 구축 2(게시물 작성 및 상세 페이지)

esoog Polaris 2023. 7. 20. 15:52
반응형

1. 게시물 관련 로직을 디자인 할 차례다. 먼저 게시물 작성(write)에 관하여.

views/board 폴더에 write.jsp파일을 생성.

그리고 아래 코드를 추가한다.

 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>작성</title>
</head>

<body>

	<form method="post">
		<label>제목</label>
		<input type="text" name="title" /><br />
		<label>작성자</label>
		<input type="text" name="nick" /><br />
		<label>내용</label>
		<textarea cols="50" rows="5" name="text"></textarea><br />
		<button type="submit">작성</button>
	</form>

</body>

</html>

* 참고로 jsp제일 상단에 있는 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 태그는

jstl 언어 core에 있는 문법 태그를 사용하기 위함이다. 상단 2개태그는 jsp파일에 세트로 가져간다.

* form 태그 내용을 "post"  방식으로 보냈는데, 사용자가 서버로 보내니까 post로 보낸다는 정도만 인식하고 넘어간다.

name 속성 이름으로 구분 이름으로 보내기에 정확히 넣어야 한다.

 

 

 

 

2. 다음에는 jsp파일을 컨트롤 할 BoardController에 url매핑 추가

아래 코드를 추가

 

//게시물 작성
@RequestMapping(value = "/write", method = RequestMethod.GET)
public void getWirte() throws Exception {
 
}

 

 

 

 

3. 여기서 post로 보낸 데이터를 실제 Service-DAO-데이터베이스 에 데이터를 삽입하는 로직이 없다.

우선 쿼리문 먼저 만들어준다. boardMapper.xml에 아래 코드를 추가한다.

 

<!-- 작성 -->
<insert id="write" parameterType="com.project.model.BoardVO">
 insert into
  board(title, text, nick)
   values(#{title}, #{text}, #{nick})
</insert>

* 읽어보면 insert문에 대한 태그와 쿼리가 쓰여있다. parameterType 는 데이터를 보낼 때의 속성.

 

 

그리고 매퍼를 사용할 자바 클래스. BoardDAO에 아래 코드를 추가한다.

 

//게시물 작성
public void write(BoardVO vo) throws Exception;

 

 

그러면 동시에 BoardDAOImpl에 가면 메서드 구현하라고 빨간줄이 생기는 데;

(쉽게는 빨간 줄 뜬 곳에 마우스 올리면 Add시키는 방법으로도 할 수 있음)

 

@Override
public void write(BoardVO vo) throws Exception {

    sql.insert(namespace + ".write", vo);

}

* 오버라이드 함수 안에 추가하면 되는데;

Mybatis 문법이며, namespace는 매퍼파일 모든 쿼리 범위를 뜻하며, .write는 wrtie라는 쿼리 id를 찾아 vo에 로직을 실행한다.

 

 

 

 

4. 그럼 비즈니스 로직, Service를 이제 구현해보자.

(일단 BoardDAO와 BoardService는 로직이 같아서 똑같은 코드를 추가하면 된다.)

BoardServiceImpl은 DAO를 사용하는 방법이 달라서 구현 코드가 다르다.

아래 코드를 추가하면 된다.

 

@Override
public void write(BoardVO vo) throws Exception {
    dao.write(vo);
}

* dao의 write함수에 vo를 입력하는 거다.

 

 

 

 

5. 돌아와서 처음 처리하지 못했던, Post방식을 처리할 컨트롤러 로직을 만들어줘야 한다.(BoardController)

아래 코드를 추가한다.

 

//게시물 작성
@RequestMapping(value = "/write", method = RequestMethod.POST)
public String postWirte(BoardVO vo) throws Exception {
    service.write(vo);

    return "redirect:/board/list";
}

* 먼저 매핑 방식으로 POST를 받아 구현한다.

이 전에 작성했던 이것과 뭔 차이며 뭔 역할인지 헷갈리는데;

@RequestMapping(value = "/write", method = RequestMethod.GET)
public void getWirte() throws Exception {
}

* 이건 해석하면, 단순히 /board/write로 들어온 요청을, 반환타입 없이 해당 뷰(write.jsp 또는 html로 연결시켜준다.)

근데 왜 get으로 요청이 있다는 식으로 함수를 실행시켰을까 애초에? 이는 브라우저가 기본요청을 get으로 시도한다는 의미다.

* 그리고 return "redirect:/board/list"; 는 리다이렉트 페이지로서 해당 페이지로 돌아간다는 뜻이다.

 

 

 

 

6. 작성을 했으니 이번에는 조회(view), 즉 작성 게시물 상세 링크 페이지를 구현 해보자.

views/board 폴더에 view.jsp파일을 생성.

일단 파일만 생성하고 나중에 디자인 하면 된다.

 

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>조회</title>
</head>

<body>

</body>

</html>

 

 

 

 

7. 그리고 BoardController에서 조회용 get 메서드를 구현해준다.

 

// 조회
@RequestMapping(value = "/view", method = RequestMethod.GET)
public void getView() throws Exception {

}

 

 

 

 

8. 다음으로 목록 페이지에서 목록 하나하나가 링크 페이지로 구현 되어야 한다.

list.jsp파일에서 ${list.text} 부분을 조금 수정하면 된다. (일반적으로 게시물들이 제목을 크릭하면 상세 링크 페이지로 넘어가니까)

 

    <a href="/board/view?idx=${list.idx}">${list.title}</a>

* a링크 태그 url로 걸린부분은 ${list.title}를 클릭하면 이동되는 url이다.

필자는 idx컬럼을 기본키롤 할당했고, 이를 토대로 게시물을 인덱싱하려 했다.

?idx=${list.idx} 의 의미는 ?(get) 요청으로 idx이름으로 ${list.idx} 값을 넘긴다는 것이다.

그런데 해당페이지에서 게시물을 보게 하려면? 역시나 데이터베이스에 접근해야한다. 그럼 뭐다?

매퍼!

 

 

 

 

9. boardMapper파일로 가서 view페이지에서 가져올 데이터 로직을 만들어준다.

아래 코드를 추가한다.

 

<!-- 게시물 조회 -->
<select id="view" parameterType="int" resultType="com.project.model.BoardVO">
 select 
  idx, title, text, nick, date, hcount
 from 
  board
 where
  idx = #{idx}   
</select>

*  여기서 주의할 점은. list페이지에서 추가했던 a링크의 ?idx={list.idx} 의 값을 DAO로 전달하고, 

DAO에서 객체를 만들어 

boardMapper.xml(매퍼)에서 사용하는 방법은 #{idx}  이렇게 사용한다.

(매퍼에서는 #{}으로 사용. jsp에서는 ${}이렇게 사용한다.)

그리고 결과 객체를 리턴타입으로 받아온다.

 

 

 

 

10. 그 다음은 DAO, Impl 파일 코드 추가한다.

BoardDAO 파일에

 

// 조회
public BoardVO view(int idx) throws Exception;

 

 

BoardDAOImpl 파일에

 

// 조회
public BoardVO view(int idx) throws Exception {
	return sql.selectOne(namespace + ".view", idx);
}

* Mybatis 셀렉트 원문을 사용해서 매퍼의 .view아이디에 idx를 넘겨줌.

 

 

 

 

11. 비즈니스 로직으로 구현하면~Service.

BoardService 파일에

 

// 조회
public BoardVO view(int idx) throws Exception;

 

 

BoardServiceImpl 파일에

 

// 조회
public BoardVO view(int idx) throws Exception {
    return dao.view(idx);
}

* DAO의 뷰를 간접적으로 접근하는 거임.

 

 

 

 

12. 다음으로 컨트롤러에서 리턴받은 데이터를 처리하고 view와 상호작용하는 로직으로 수정.

조회 메서드를 아래 코드로 수정.

 

//조회
@RequestMapping(value = "/view", method = RequestMethod.GET)
public void getView(@RequestParam("idx") int idx, Model model) throws Exception {
	BoardVO vo = service.view(idx);
	model.addAttribute("view", vo);
}

* 여기서 갑자기 멘탈이 흔들릴 수 있는데, 붙잡고 하면 된다.

먼저, @RequestParam("idx") int idx 은 파라미터 "idx"를 int idx로 값으로 받고,

Model model 은 뷰(V)에 데이터를 전달하는 객체를 생성 주입하는 역할을 한다.

코드 맨아래 부분을 사용해서 뷰로 보낸다.

 

 

 

 

13. 그리고 모델에서 전달받은 객체를 뷰에서 활용하면 된다.JSP!

view.jsp 파일 body 태그에 아래 코드로 수정하면 된다.

* ${} 이거는 jsp 에서 jstl언어로 모델 객체의 변수를 사용하는 방법

 

<label>제목</label>
${view.title}<br />

<label>작성자</label>
${view.nick}<br />

<label>내용</label><br />
${view.text}<br />

확인. 나이스.

728x90