22.02.09 TIL

서승원·2022년 2월 9일
0

TIL

목록 보기
65/68
post-thumbnail

22.02.09
https://github.com/crimy/gocom/

Transactional 태그 이용해서 추천,반대 기능 구현 완료
try,catch 통한 예외처리로 중복추천/반대의 차단 및 alert 출력과 비로그인시의 예외처리 완료
현재 존재하는 페이지 모두 부트스트랩 탬플릿 이용해 디자인 적용 완료
방명록 구현 예정.
페이징 DTO 구현 예정

오늘은 나름대로 깔끔한 예외처리를 한 것에 만족했다.

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
@RequestMapping(value="recommend")
    public ModelAndView recommend(HttpServletRequest request, HttpServletResponse response) throws Exception {
        int con_no = Integer.parseInt( request.getParameter("no") );
        String userid = "";
        ModelAndView mnv = new ModelAndView();
        HttpSession session = request.getSession();
        userid = (String) session.getAttribute("userid");
        
        System.out.println( con_no + "," + userid );
        try {
            if( userid != null ) {            
                int result1 = boardService.recommend(con_no,userid);
                if( result1 == 0 ) {                    
                    mnv.addObject("message","error");                    
                }
            } else {
                AlertUtil.alertAndBackPage(response, "로그인이 필요합니다");
            }
        } catch ( Exception e ) {
            e.printStackTrace();
            AlertUtil.alertAndBackPage(response, "이미 추천했습니다");
        }
            
        mnv = review( con_no );
        
        return mnv;
    }
    
    @RequestMapping(value="warn")
    public ModelAndView warn(HttpServletRequest request,HttpServletResponse response) throws Exception {
        int con_no = Integer.parseInt( request.getParameter("no") );
        String userid = "";
        ModelAndView mnv = new ModelAndView();
        HttpSession session = request.getSession();
        userid = (String) session.getAttribute("userid");
        
        System.out.println( con_no + "," + userid );
        try {
            if( userid != null ) {            
                int result1 = boardService.warn(con_no,userid);
                if( result1 == 0 ) {                    
                    mnv.addObject("message","error");                    
                }
            } else {
                AlertUtil.alertAndBackPage(response, "로그인이 필요합니다");
            }
        } catch ( Exception e ) {
            e.printStackTrace();
            AlertUtil.alertAndBackPage(response, "이미 반대했습니다");
        }
            
        mnv = review( con_no );
        
        return mnv;
    }
    
    public ModelAndView review( int con_no ) throws Exception {
        ModelAndView mnv = new ModelAndView();
        BoardDTO dto = boardService.boardView(con_no);
        List<ImageDTO> i_list = imageService.imageView(con_no);
        mnv.addObject("i_cnt", i_list.size() );
        mnv.addObject("path", ImageUtil.path() );
        mnv.addObject("image", i_list);
        mnv.addObject("board", dto);
        mnv.setViewName("board/content2");
        return mnv;
    }
cs

try와 catch문을 이용해서 session으로부터 얻은 userid 의 값이 null인지 아닌지부터 판별한다. 해당 추천 method에서 로그인 상태가 아닐 경우를 구별하기 위해서다.
https://redcoder.tistory.com/195
님의 글로부터 java class에서부터 alert문을 사용하는 방법을 이전에 사용했던 것을 기억해 다시 사용해서 실패시 알림 방식을 정했고, userid의 값이 null이 아니라면 sql문을 실행하도록 한다.
우선, sql문을 2개로 나눴는데, 중복 추천을 막기 위해 board의 con_no와 member의 userid 를 참조한 테이블인 reclist와 warnlist 테이블을 만들었다. 해당 테이블에 추천하는 사람과, 추천하는 게시글을 기록하기 위한 테이블이다. 이 테이블에 insert를 하고 board 테이블의 rec_cnt / warn_cnt 를 update해 추천/반대 수를 업데이트 하는 sql 문이다. board테이블의 update 문은 단독으로 중복 추천/반대를 막을 수 없기때문에 이렇게 구성했고, 이 논리가 맞으려면 트랜잭션을 사용해야 한다. 그렇기때문에 servlet-context.xml에 위와 같이 입력한다.

1
2
3
4
5
6
7
8
<!-- 트랜젝션 관리 객체 -->
    <beans:bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- name은 DataSourceTransactionManager클래스의 변수 명이고 ref는 위의 dataSource를 DI하겠다는 것 -->
    <beans:property name="dataSource" ref="dataSource" />
    </beans:bean>
    
    <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
    
cs

@Transactional 태그를 사용하기 위해서 bean을 추가하고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
    @Transactional
    public int recommend(RecListDTO dto) {    
        sqlSession.update("gocomMapper.recommend",dto.getCon_no());    
        return sqlSession.insert("gocomMapper.recBoard", dto );
    }
 
    @Override
    @Transactional
    public int warn(WarnListDTO dto) {
        sqlSession.update("gocomMapper.warn",dto.getCon_no());    
        return sqlSession.insert("gocomMapper.warnBoard", dto );
    }
 
cs

BoardDAOImpl 에 각각의 추천/반대 sql문을 Mapper로부터 불러오는 함수를 작성한다.


이렇게 성공했다. 추천 실패 후에 redirect 됐을 때 추천 수가 제대로 표기되지않는다. 이 문제를 해결해야 할 것 같다.

내일은 게시판의 페이지화를 위한 PageDTO를 구현할 예정이다.

profile
2년차 백엔드 개발자, crimy

0개의 댓글