본문 바로가기
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

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

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

반응형