본문으로 바로가기

[Spring] 게시판 만들기

category Back-end/Spring 2016. 4. 21. 14:26

ARTICLE_ID : 진짜 글의 id

ARTICLE_NUMBER : 사용자에게 보여줄 글 번호


articleDAO.xml

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
<mapper namespace="ArticleDAO">
 
    <select id="nextArticleSeq" resultType="_int">
        SELECT    ARTICLE_ID_SEQ.NEXTVAL
        FROM    DUAL
    </select>
    
    <select id="nowDate" resultType="string">
        SELECT    TO_CHAR( SYSDATE, 'YYYYMMDD' )
        FROM    DUAL
    </select>
    
 
    <insert id="insertNewArticle" parameterType="ArticleVO">
        INSERT INTO ARTICLE (
                                ARTICLE_ID /* AR-20160421-000001 */
                                , ARTICLE_NUMBER /* 1 */
                                , SUBJECT
                                , DESCRIPTION
                                , WRITER
                                , CREATED_DATE
                                , MODIFIED_DATE
                            ) 
        VALUES                 ( 
                                #{articleId}
                                , #{articleNumber}
                                , #{subject}
                                , #{description}
                                , #{writer}
                                , SYSDATE
                                , SYSDATE
                            )
    </insert>
    
cs


쿼리를 만들어 줍니다. 현재 articleNumber와 nextArticleNumber seq를 동시에 가져올 수 없으므로 미리 이전에 만들어줍니다.


DAO 인터페이스에서 실행할 쿼리를 순서대로 적어줍니다.


1
2
3
4
5
6
7
8
9
10
11
public interface ArticleDAO {
    /**
     ************************************ 
     ************************************
     */
    public int nextArticleSeq();
    public String nowDate();
    public int insertNewArticle(ArticleVO articleVO);
    
}
 
cs

그리고 DAOImpl로 가서 SqlSession을 실행시킨뒤 결과 값을 가져옵니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class ArticleDAOImpl extends SqlSessionDaoSupport implements ArticleDAO{
 
    @Override
    public int insertNewArticle(ArticleVO articleVO) {
        return getSqlSession().insert("ArticleDAO.insertNewArticle", articleVO );
    }
 
    @Override
    public int nextArticleSeq() {
        return getSqlSession().selectOne("ArticleDAO.nextArticleSeq");
    }
 
    @Override
    public String nowDate() {
        return getSqlSession().selectOne("ArticleDAO.nowDate");
    }
 
cs


Biz 인터페이스에서 새 글을 쓰는 writeNewArticle을 만들어줍니다.
BizImpl에서 

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
public class ArticleBizImpl implements ArticleBiz {
 
    private ArticleDAO articleDAO;
    
    public void setArticleDAO(ArticleDAO articleDAO) {
        this.articleDAO = articleDAO;
    }
 
    @Override
    public boolean writeNewArticle(ArticleVO articleVO) {
        
        // 만들지 않은 것은 던진다고 알려준다는 뜻 // throw new NotImplementedException();
        
        int nextArticleId = articleDAO.nextArticleSeq();
        String nowDate = articleDAO.nowDate();
        
        /**
         * ArticleID의 형식
         * AR-20160421-000001
         */
        
        String articleId = "AR-" + nowDate + "-" + lpad(nextArticleId + " "6"0");
        
        articleVO.setArticleNumber(nextArticleId);
        articleVO.setArticleId(articleId);
        
        
        return articleDAO.insertNewArticle(articleVO) >0 ;
    }
     /**
     * 
     * @param source 원본
     * @param length 만들어야 하는 길이
     * @param defValue 채워질 글자
     * @return
     */
    private String lpad(String source, int lengthString defValue) {
        
        /*
         * 100 : 3
         * 000100 : 6
         */
        
        int sourceLength = source.length();
        int needLength = length -  sourceLength;
        
        for ( int i=0; i<needLength; i++ ) {
            source = defValue + source;
        }
        
        return source;
    }
cs

쿼리를 실행시키면서 얻은 now date와 nextArticleNumber를 가지고 articleId를 만들어줍니다.

그리고 articleVO에 넣어준뒤 DAO.insertArticle을 실행시켜주는 문장을 만듭니다.

id형식은 AR-20160421-000001와 같이 만들기 위해 lpad도 추가해주었습니다.


ArticleService에서 writeNewArticle이 실행되는 문장을 넣어주고 ArticleServiceImpl에 실행구문을 추가해주는 것은

이전 게시글에 있습니다.