게시판〃(5) board.dao 와 board.service 패키지

반응형


이제 게시판 만들기 프로젝트의 10분의 1정도 완성이 되었습니다. 앞으로도 결과물을 얻는 개발 카테고리는 제목 (1)부터 쭉 순서대로 따라오시는게 좋습니다. 그 이유는 한번 정리했던 부분에 대해서 그냥 넘어갈 수 있기 때문에 중간부터 본다면 벙찔수 있기 때문이죠. 


그럼 이번글에서는 데이타를 접근하게 만드는 DAO(Data Access Object)클래스를 만들어 볼텐데요. 저는 스프링 프레임워크의 DI기능을 이용할것이기에 Service 주입에 대한 DAO도 따로 만들었습니다.




board.dao와 board.service 패키지 생성


패키지 생성은 마우스를 board에 가져다 놓고

우클릭 후 패키지를 눌러 만듭니다.


board.dao의 구성 클래스파일로는

BoardDao를 인터페이스로 만들어 BoardDaoImpl 클래스에서

상속받아 사용합니다.


board.service도 구성은 비슷합니다.

BoardService를 인터페이스로 만들고 BoardServiceImpl 클래스에서

상속받아 사용하죠.


차이를 알아보자면 BoardDao와 BoardService 코드가 거의 동일하지만

끝에 Impl이 붙은 클래스파일은 코드가 완전 다릅니다.





 BoardDao.java 작성하기(interface로 만듬)



▲ BoardDao에서 사용되는 클래스



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package board.dao;
 
import java.util.List;
 
import board.dto.BoardDto;
 
public interface BoardDao {
 
    public List<BoardDto> boardList(String keyfield, String keyword);
    public String preView(int seq);
    public BoardDto findBySeq(int seq);
    public BoardDto viewContent(int seq);
    public void insertBoard(BoardDto board);
    public int updateBoard(BoardDto board, String pass);
    public String deleteView(int seq);
    public int deleteBoard(int seq, String storPass);
    public void replyBoard(BoardDto board);
    public void replyUpPos(BoardDto board);
 
}


▲ BoardDao 소스코드


일단 board.dao 패키지 우클릭후 new → interface 로 클래스파일을 만들고 BoardDao로 이름을 지정한뒤 만들어줍니다. 자바로만 이용하면 getter와 setter로만 이용하지만, 저는 스프링 프레임워크의 DI기능을 이용하기에 필요한 클래스들을 인터페이스로 선언해준 모습이죠. 


여기서 public 다음에 붙은 <boardDto>나 String / BoardDto / int 는 다음글에서 생성할 mybatis와 관련이 있습니다. mybatis는 프로젝트를 DB와 연동하는데 도와주는 역활을 하는데요. 그 부분에서 BoardMapper.xml을 만들게 되는데 select절인 [9~12]번은 자유롭게 타입을 정해준거죠. 반면 insert, delete, update절인 나머지 부분 [13 ~18]은 파라미터 타입이기에 int / string / void(리턴값이 필요없는경우)로 선언했습니다.



public List<BoardDto> boardList(String keyfield, String keyword);

→ Select절로 DTO에서 하나씩 가져오지만 여러개를 뽑아와야 되니 배열형식으로 사용.



public String preView(int seq);

→ preView는 select절이지만 Ajax기능으로 DTO를 쓰지 않음.




public BoardDto findBySeq(int seq); public BoardDto viewContent(int seq);

→ select절로 DTO에서 시퀀스로 하나씩 가져옴.



public void insertBoard(BoardDto board);

public void replyBoard(BoardDto board);

public void replyUpPos(BoardDto board);

→ inset절이기에 return값이 필요하지 않음.



public int updateBoard(BoardDto board, String pass);

→ update부분으로 글수정이 성공되면 번호를 부여하기 위해 int 타입

글에 해당하는 board / 패스워드에 해당하는 pass



public int deleteBoard(int seq, String storPass); public String deleteView(int seq);

→ delete절로 

deleteBoard는 삭제후 성공되면 번호를 부여하기 위해 int 타입

deleteView는 삭제후 넘어가는 화면



 BoardDaoImpl.java 작성하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package board.dao;
 
import java.util.ArrayList;
import java.util.List;
 
import board.dto.BoardDto;
import board.mybatis.BoardManager;
 
 
public class BoardDaoImpl implements BoardDao{
        
    
    // 상속받은걸 오버라이드함
    @Override
    public List<BoardDto> boardList(String keyfield, String keyword) {
        List<BoardDto> result = new ArrayList<BoardDto>();
        System.out.println("정상적으로 값이 들어옴");
        System.out.println(keyfield + "//" + keyword);
        result = BoardManager.boardList(keyfield, keyword);
        System.out.println(result.size());
        return result;
    }
 
    @Override
    public String preView(int seq) {
        String preContent = BoardManager.preView(seq);
        return preContent;
    }
 
    @Override
    public BoardDto findBySeq(int seq) {
        BoardDto result = BoardManager.findBySeq(seq);
        return result;
    }
 
    @Override
    public BoardDto viewContent(int seq) {
        BoardManager.readCount(seq);        // 글보면 카운트수 증가
        BoardDto result = BoardManager.findBySeq(seq); // 실질적인 글읽기
        return result;
    }
 
    // 글쓰기는  upPos와 insertBoard 두개임
    public void upPos(){
        BoardManager.upPos();
        System.out.println(" 글을 쓰면 Pos 1업");
    }
        
    public void insertBoard(BoardDto board) {
        upPos();
        BoardManager.insertBoard(board);
    }
    // --------------------------------------------- 여기까지
 
    
    // 게시글 수정,삭제는 바로 리턴 ...... 글쓰기는 void처리
    public int updateBoard(BoardDto board, String pass) {
        return BoardManager.updateBoard(board, pass);
    }
 
    // 게시글 수정,삭제는 바로 리턴
    public int deleteBoard(int seq, String storPass) {
        return BoardManager.deleteBoard(seq, storPass);
    }
 
    @Override
    public String deleteView(int seq) {
        String storPass = BoardManager.deleteView(seq);
        return storPass;
    }
 
    @Override
    public void replyBoard(BoardDto board) {
        BoardManager.replyboard(board);        
    }
 
    @Override
    public void replyUpPos(BoardDto board) {
        BoardManager.replyUpPos(board);
    }
 
}


▲ BoardDaoImpl 소스코드


다음은 BoardDao를 상속받은 BoardDaoImpl파일을 만들었습니다. 이 코드를 잘보시면 BoardManager를 import하여 작성하였는데요. 이 게시판이 스프링을 연동하여 같이 만들었기 때문에 완벽한 흐름을 위해서라면 글 하나당 파일 하나를 잡고 수십개의 글을 만들어야 하는데 그럴 자신이 없었습니다. 

아니면 이 글에도 mybatis폴더를 만들어 BoardManager.java를 작성해야 하는데 글의 정리가 쉽지 않아 패키지별로 묶었으니 링크를 따라 보시는게 편하실것 같습니다.



자.. 이제 링크를 먼저 보시고 이 글을 보셨다는 가정하에 정리하도록 하겠습니다. BoardManager파일에서는 DB를 연결하는 sqlSessionFactory를 이용하여 sqlMapper로 변수를 지정해주고 BoardDao의 모든 클래스에 session으로 연동하였습니다. 





[30번째]줄에 해당하는 findBySeq클래스로 예를 들어볼까요. 위 사진을 보시면 BoardManager파일에서는 session 으로 findBySeq의 값을 selectOne으로 하나를 골라 board를 리턴 받았습니다. 다음 BoardDaoImpl에서 result 변수에 그 값을 저장하죠. 한번 거쳐 만들어진 result값은 디스패쳐서블릿에 해당하는 applicationContext파일에 저장하게됩니다. 


그렇게 저장이 되면 말이죠. 컨트롤러에서 @어노테이션으로 BoardDao만 import해줘도 BoardDaoImpl 해당하는기능이 포함되어 편하게 사용할 수 있습니다. 기존 자바로만 이용한다면 BoardDao를 인터페이스로 만들지 않았겠지만, 일일이 하나하나 저장해줘야 하기에 귀차니즘 본능으로 DI기능을 사용한것입니다. 


[15~22번째]줄인 List도 길게만 느껴지지 원리는 똑같습니다. List라 여러개의 값을 받기 위해 배열로 선언한것 뿐이고 제대로 동작하는지 알기 위해 system.out.println 으로 표시해서 줄이 좀 길어졌습니다. 이 부분이 제대로 동작하게 되면 나중에 "정상적으로 값이 들어옴"이라고 콘솔창에 뜰 것입니다. 





 BoardService.java 작성하기(interface로 만듬)


▲ BoardService에서 사용되는 클래스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package board.service;
 
import java.util.List;
 
import board.dto.BoardDto;
import board.dto.PageDto;
 
public interface BoardService {
 
    public List<BoardDto> boardList(String keyfield, String keyword);
    public BoardDto findBySeq(int seq);
    public BoardDto viewContent(int seq);
    public void insertBoard(BoardDto board);
    public int updateBoard(BoardDto board, String pass);
    public String deleteView(int seq);
    public int deleteBoard(int seq, String storpass);
    public void replyBoard(BoardDto board);
    public void replyUpPos(BoardDto board);
    public PageDto pagingProc(int nowPage, int nowBlock, int totalRecord);
}


▲ BoardService 소스코드


다음 스프링 프레임워크에서 DI기능의 서비스를 주입하는 BoardService의 소스코드입니다. 여기서는 페이징처리를 하기 위해 PageDto를 추가로 import하였고, 본문 미리보기인 preView를 제외 시켰습니다. preView는 Ajax기능을 넣으려고 만든거라 BoardDao에서 한번만 처리하면 되기 때문에 필요없다면 생략해도 문제 없습니다. 필요하시다면 아래 관련글 링크를 통해 AjaxController를 보고오시면 되겠습니다.






 BoardServiceImpl.java 작성하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package board.service;
 
import java.util.List;
 
import javax.annotation.Resource;
 
import board.dao.BoardDao;
import board.dto.BoardDto;
import board.dto.PageDto;
 
public class BoardServiceImpl implements BoardService {
 
    @Resource(name="boardDaoImpl")
    private BoardDao boardDao;
    
    @Override
    public List<BoardDto> boardList(String keyfield, String keyword) {
        System.out.println("BoardService.BoardList( ) 접속됨");
        return boardDao.boardList(keyfield, keyword);
    }
 
    public BoardDto findBySeq(int seq) {
        return boardDao.findBySeq(seq);
    }
 
    @Override
    public BoardDto viewContent(int seq) {
        return boardDao.viewContent(seq);
    }
 
    @Override
    public void insertBoard(BoardDto board) {
        boardDao.insertBoard(board);        
    }
 
    @Override
    public int updateBoard(BoardDto board, String pass) {
        return boardDao.updateBoard(board, pass);
    }
 
    @Override
    public String deleteView(int seq) {
        return boardDao.deleteView(seq);
    }
 
    @Override
    public int deleteBoard(int seq, String storPass) {
        return boardDao.deleteBoard(seq, storPass);
    }
 
    @Override
    public void replyBoard(BoardDto board) {
        boardDao.replyBoard(board);
    }
 
    @Override
    public void replyUpPos(BoardDto board) {
        boardDao.replyUpPos(board);
    }
 
    // 아래부터 페이징 
 
    public PageDto pagingProc(int nowPage, int nowBlock, int totalRecord) {
        int numPerPage = 5;
        int pagePerBlock = 4;
        int totalPage = (int)Math.ceil((double)totalRecord / numPerPage); 
        int beginPerPage = nowPage * numPerPage;
        int totalBlock = (int)Math.ceil((double)totalPage / pagePerBlock);
        
        PageDto page = new PageDto();
        
        page.setBeginPerPage(beginPerPage);
        page.setNowBlock(nowBlock);
        page.setNowPage(nowPage);
        page.setNumPerPage(numPerPage);
        page.setPagePerBlock(pagePerBlock);
        page.setTotalBlock(totalBlock);
        page.setTotalPage(totalPage);
        page.setTotalRecord(totalRecord);
        
        return page;
    } 

}


▲ BoardServiceImpl 소스코드

서비스 기능의 BoardService 인터페이스를 상속받아 기능을 정해주는 BoardServiceImpl의 소스코드입니다. 여기서는 코드를 보시면 정말 어려운 부분이 없는데, 어플리케이션에서 필요로 하는 자원을 자동연결하는 @Resource 어노테이션을 사용하여 시각적으로 어려워보입니다.


@Resource로 "boardDao"의 자원을 DI기능으로 의존성 주입 해주고, 그 아래는 BoardService에서 선언한 클래스들의 기능을 리턴해줍니다. void로 선언한 부분은 return 안해주는거 아시죠? 


맨 마지막에 페이징처리를 하는 pagingProc에서는 [64번]한페이지에 보여질 게시물수 5개 / [65번] 한페이지에 보여지는 블럭의 개수 4개 / [66번] 전체 페이지는 전체 게시물수 ÷ 한페이지에 보여질 게시물 수 / [67번] 한페이지에 보여지는 가장 맨 윗글 / [68번] 전체 블럭 = 전체 페이지 ÷ 한페이지에 보여지는 블럭수 이런식으로 지정해 주었습니다.  글로만 설명하니 어려워 보이네요. 나중에 결과물이 완성되면 출력되는 화면에 표시를 해두겠습니다.

반응형