본문 바로가기

old

[JSP/Servlet] 게시판이 돌아가는데 필요한 큰 그림

준비물: WEBCONTENT 안 jsp 페이지, Entity 페키지, Service 패키지, Controller 패키지


순서

1. HTML 기반의 jsp 페이지를 만든다. (reg.jsp) form 태그의 action 안에는 controller의 매핑 주소를, method 안에는 get이나 post를 입력한다.

2. Entity에 데이터베이스의 값을 저장한다. (Notice.java)

3. Service에 JDBC를 연결하고 SQL문으로 필요한 값을 받아오는 함수를 만든다. (NoticeService.java)

4. Controller 패키지는 최종.java라고 볼 수 있다. form 태그의 action에 담긴 jsp의 행동을 정의한다. @WebServlet을 정의하고 Service 클래스에서 정의한 함수를 불러내 response.sendRidirect()로 웹 브라우저에 응답을 보낸다. (regController.java)

 

 


1. JSP 페이지

list.jsp

page, field, query 변수를 받아 Service.getList() 안의 파라미터로 넣어서 list<Entity> 자료형의 변수에 넣는다.

단, page라는 변수명은 jsp가 가지고 있는 내장 변수가 page라는 이름을 사용하고 있어서 오류가 발생하니 page_ 등으로 고친다.

 

f 값 받기

//선택된 값을 돌려주어 select option에 selected 붙을 옵션 지정하기
<form action="list.jsp" method="get"> // name 값을 list.jsp로 get 방식으로 돌려준다
 	<label class="d-none">검색 분류</label>
 	<%
 	String selectedTitle = "";
 	String selectedWriterId = "";

	if(field.equals("title"))
		selectedTitle = "selected";
	if(field.equals("writer_id"))
		selectedWriterId = "selected";
%>

// 파라미터로 받은 f 값을 지정한다. f의 값은 value값인 title, writer_id가 될 수 있다.
<select name="f">
	<option>분류선택</option>
	<option <%= selectedTitle %> value="title">제목</option>
	<option <%= selectedWriterId %> value="writer_id">작성자</option>
</select>

q 값 받기

<label class="d-none">검색어</label>
	<input type="text" name="q" value="<%=query%>"> // q의 값은 input[type=text]로 입력받은 값이 된다
	<input type="submit" value="검색">
</form>

Notice 자료형의 임의의 변수 m을 참조변수 list에서 하나씩 꺼내서 추가하기

<tbody>
<%
for (Notice m : list) {
%>
	<tr>
      <td class="w-1"><%=m.getId()%></td>
      <td class="truncate text-align-left"><a href="detail.jsp?id=<%=m.getId()%>"><%=m.getTitle()%></a></td>
      <td class="w-2"><%=m.getWriteId()%></td>
      <td class="w-2"><%=m.getRegDate()%></td>
      <td class="w-1"><%=m.getHit()%></td>
	</tr>
<%
}
%>
</tbody>

 

detail.jsp

1. 수정 페이지로 가는 버튼 만들기

<a href="edit.jsp?id=<%=id %>">수정</a>

2. 삭제하겠냐는 alert 참 띄우기, 취소를 누르면 false 리턴, 확인을 누르면 del

<a href="del?id=<%=id %>" onclick="if(!confirm('삭제할꺼?')) return false">삭제</a>

edit.jsp

아이디를 input[type=hidden] 상태로 얻음, 이것은 헤더에서 service.get(id)에서 해당 행을 받아오는 용도로 쓰임

<input type="hidden" name="id" value="<%=id %>">

 

reg.jsp

헤더로 무언가를 받아올 필요가 없다. 다만 name=title, name=content, name=writer_id를 만들어 value 값을 받아 action=reg에 넘겨준다.

 

2. Entity 패키지

데이터베이스의 값을 담는 class들을 모아 두는 공간.

Member, Notice 등의 제목은 테이블에 해당하고 내부에 선언된 변수들은 컬럼명에 해당한다고 생각하면 된다.

기본 생성자, 파라미터를 받는 생성자, getter setter, toString 메소드를 가지고 있다.

3. Service 패키지

특정 조건의 데이터베이스를 불러오는 메소드의 집합.

getList()

  • list 자료형인 getList를 반환하게 만든다.
  • 파라미터가 없는 default 값을 입력하는 메소드(DB 연결이 필요하지 않다)에 default 값에 파라미터를 입력받는 메소드를 오버라이드한다.
    public List<Notice> getList() throws ClassNotFoundException, SQLException {
        return getList(1, "title", "");
    }

    public List<Notice> getList(int page, String field, String query) {

1. list 자료형의 list를 선언한다.

2. 아래는 데이터베이스를 불러오는 필수 과정이다.

int result = 0;

String sql = "INSERT INTO NOTICE(TITLE, CONTENT, WRITER_ID) VALUES(?, ?, ?)";
String url = "jdbc:oracle:thin:@ ,,,,,,";

Class.forName("oracle.jdbc.OracleDriver");
Connection con = DriverManager.getConnection(url, "ID", "PW");

PreparedStatement st  = con.prepareStatement(sql);
st.setString(1, notice.getTitle());
st.setString(2, notice.getContent());
st.setString(3, notice.getWriteId());


result = st.executeUpdate();

st.close();
con.close();

return result;
  1. String sql = "SELECT * FROM .. WHERE ID=?" // sql 구문
  2. String url = "jdbc:oracle: .." // DB 주소
  3. Class.forName("oracle.jdbc.OracleDriver") // JDBC 로드
  4. Connection con = DriverManager.getConnection(url, "ID", "PW") // 데이터베이스 아이디와 비밀번호를 적어 연결'
  5. 객체에서 읽어오기: PreparedStatement st = con.prepareStatement(sql); // sql 구문에 데이터를 꽂아줄 수 있는 기능을 내장하고 있다
  6. 엔티티 객체에 저장하기
    1. new 자료형()으로 엔티티 객체를 생성한 후
    2. 자료형으로 DB값을 받아와서 객체에 저장함: notice.setId(st.getInt("id"))
    3. list.add(notice)로 list에 정보를 넣음 
  7. 엔티티 객체 값을 수정하기
    1. 객체에서 값을 받아와 sql ?에 자료형으로에 set함: st.setnt(notice.getID())
    2. result = st.executeUpdate or st.excuteQuery로 result에 저장함
    3. return result 결과를 반환함
  8. int result = 0; result = st.executeUpdate() // 영향을 준 레코드 수를 리턴한다. Select로 조회만 할 경우 executeQuery()를 사용한다
  9. st.close();con.close(); Connection 객체와 PreparedStatement 객체를 닫아 준다

 

3. list를 반환한다.

 

그 외 CRUD에 필요한 메소드

get(int id) : id 값을 인자로 받아 해당하는 행의 모든 값을 불러온다 // service.getList()는 행이 아니라 리스트를 뽑아올 때 사용한다는 차이점이 있다

getCount(String field, String query) : 행 이름과 입력값을 받아 검색하면 해당 조건에 맞는 검색 결과 수를 반환한다

update(Notice notice) : notice를 매개변수로 받아 이미 존재하는 값들을 받아와 업데이트해 주고 영향을 준 레코드의 개수를 반환한다. 편집컨트롤러에서 사용한다.

insert(Notice notice) : notice를 받아 필수 정보들만 받아 새 행을 생성한다. 글쓰기 컨트롤러에서 사용된다.

delete(int id): id값을 받아 해당 행을 삭제한다.


4. Controller 패키지

doGet, doPost, 인코딩, sendRedirect가 이루어지는 곳이다. 매개변수를 받아와 service 함수를 이용해 DB 조작을 마친 후 페이지를 이동시킨다.

RegController.java (글쓰기 기능)

  1. title(글 제목), content(글 내용), writer_id(작성자 아이디)값을 받는다.
  2. Notice notice를 생성하고 notice의 setter 메서드를 이용하여 notice에 저장한다.
  3. service의 insert(notice)함수를 이용해 notice 값을 DB에 저장한다.
  4. 완료하면 response.sendRedirect() 함수를 통해 list.jsp로 돌아간다.

EditController.java (글 수정 기능)

  1. title(글 제목), content(글 내용), id(글 고유 번호)값을 받는다.
  2. Notice notice를 생성하고 notice.get(id) 메서드를 이용하여 id(글 고유 번호)에 해당하는 글 정보를 가져온다.
  3. notice의 setter 메서드를 이용해 받아온 title, content를 가져온 notice 값에 덮어쓴다.
  4. service의 update(notice)함수를 이용해 notice 값을 DB에 저장한다.
  5. 완료하면 response.sendRedirect() 함수를 통해 detail.jsp?id=(글 상세정보 페이지)로 돌아간다.

DelController.java(글 삭제 기능)

  1. 클라이언트로 넘겨줄 정보가 없기 때문에 doGet을 사용한다.
  2. id(글 고유 번호)를 인자로 받아 Integer.parseInt 한다.
  3. service의 delete(id) 함수를 이용해 id에 해당하는 행을 DB에서 삭제한다.
  4. 완료하면 response.sendRedirect() 함수를 이용해 list.jsp로 돌아간다.