본문 바로가기
Web Development/Spring

[Spring+DB]방문자정보 저장, 방문자수 조회

by 피치피치어피치 2018. 1. 25.

SessionListener와 DB를 활용하여 세션이 생성될때마다 방문기록을 DB에 넣어볼것이다.

Request Header 속성을 활용해서 정보를 가져올것이므로 Header관련 정보가 들어가도록 테이블을 만들자.

 

1.DDL

1
2
3
4
5
6
7
 CREATE TABLE TB_VISITOR(
        VISIT_ID INT PRIMARY KEY,--기본키 , 시퀀스 달것임
        VISIT_IP VARCHAR(100NOT NULL--접속자 아이피
        VISIT_TIME DATETIME NOT NULL--접속자 접속시간
        VISIT_REFER VARCHAR(300NOT NULL--접속자가 어느사이트를 타고 들어왔는지
        VISIT_AGENT VARCHAR(400NOT NULL --접속자 브라우저 정보
 
cs

 

DB 필드에 대응하는 VO를 만들고

2.VisitCountVO.java

1
2
3
4
5
6
7
8
9
10
public class VisitCountVO{
        private int visit_id;
        private int visit_ip;
        private int visit_time;
        private int visit_refer;
        private int visit_agent;
 
        //constructor/setter/getter 생략
    }
 
cs

 

DAO를 만들고

3.VisitCountDAO.java

1
2
3
4
5
6
public class VisitCountDAO{
        public int insertVisitor(VisitCountVO vo) throws Exception{
            return insert("VisitCounterDAO_insertVisitor",vo);
        }
    }
 
cs

 

MyBatis xml을 만들고

4.VisitCount_SQL.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
        <insert id="VisitCountDAO" parameterType="kr.co.yg.vo.VisitCountVO">
            INSERT
            INTO TB_VISITOR
            (
                VISIT_ID,
                VISIT_IP,
                VISIT_TIME,
                <if test="visit_refer != null and visit_refer !=''">
                VISIT_REFER,
                </if>
                VISIT_AGENT
            )
            VALUES
            (
                VISITOR_SEQ.NEXTVAL,
                #{visit_ip},
                SYSDATETIME,
                <if test="visit_refer != null and visit_refer !=''">
                #{visit_refer},
                </if>
                #{visit_agent}
            )
        </insert>
    </mapper>
cs

 

세션이 생성될때마다 실행되는 HttpSessionListner를 활용

5.VisitCounter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class VisitCounter implements HttpSessionListener{
        @Override
        public void sessionCreated(HttpSessionEvent arg0){
            HttpSession session = arg0.getSession();
            WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(session.getServletContext());
            //등록되어있는 빈을 사용할수 있도록 설정해준다
            HttpServletRequest req = ((SerevletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
            //request를 파라미터에 넣지 않고도 사용할수 있도록 설정
            VisitCountDAO visitCountDAO = (VisitCounterDAO)wac.getBean("visitCounterDAO");
            VisitCountVO vo = new VisitCountVO();
            vo.setVisit_ip(req.getRemoteAddr());
            vo.setVisit_agent(req.getHeader("User-Agent"));//브라우저 정보
            vo.setVisit_refer(req.getHeader("referer"));//접속 전 사이트 정보
            visitCountDAO.insertVisitor(vo);
        }
        @Override
        public void sessionDestroyed(HttpSessionEvent arg0){
            //TODO Auto-generated method stub
        }
    }
 
cs

 

web.xml에 sessionListener 등록 및 빈설정파일 등록

6.web.xml

1
2
3
4
5
6
7
8
9
10
11
12
<PRE class=brush:xml>    <listener>
        <listener-class>kr.co.yg.VisitCounter</listener-class>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
 
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            classpath*:yg/spring/context-*.xml
        </param-value>
    </context-param>
</PRE>
cs

 

빈설정파일 context-listener.xml 에 DAO 빈 등록

7.context-listener.xml

1
2
<bean id="visitCountDAO" class="kr.co.yg.VisitCountDAO">
 
cs

이런식으로 설정을 하면 사용자가 접속할때마다 세션이 생성되어 접속 정보가 테이블에 인서트된다(원래 접속하면 로그인 안해도 세션이 생김)

세션이 유지될동안은 카운트가 되지 않고 브라우저를 닫았다가 다시 열어서 접속하면 접속자가 추가된다(세션을 이용했기 때문에)