티스토리 뷰

#MongoDB에도 Log가 들어갈 수 있게 만드는 방법


1. Pom.xml 에 추가


  <!-- MongoDB dependencies -->

    <dependency>

       <groupId>org.mongodb</groupId>

       <artifactId>mongo-java-driver</artifactId>

       <version>3.2.2</version>

    </dependency>

    <!-- Spring WebMVCdependencies -->

    <dependency>

       <groupId>org.springframework.data</groupId>

       <artifactId>spring-data-mongodb</artifactId>

       <version>1.9.1.RELEASE</version>

    </dependency>



2. mongoContext.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

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xmlns:mongo="http://www.springframework.org/schema/data/mongo"

   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

       http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.8.xsd">

   <mongo:mongo-client

           host="localhost"

           port="27017">

       <mongo:client-options

           connections-per-host="8"

           threads-allowed-to-block-for-connection-multiplier="4"

           connect-timeout="1000"

           max-wait-time="1500"

           socket-keep-alive="false"

           socket-timeout="1500"

       />

   

   </mongo:mongo-client>

   <bean id="mongoTemplate"

           class="org.springframework.data.mongodb.core.MongoTemplate">

       <constructor-arg name="mongo" ref="mongo"/>

       <constructor-arg name="databaseName" value="log" />    

   </bean>

</beans>

Colored by Color Scripter

cs


3. CustomLogger.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

package com.ktds.smahn;

import org.slf4j.Logger;

public abstract class CustomLogger {

   private Logger logger;

   

   public CustomLogger(Logger logger) {

       this.logger = logger;

   }

   

   public void trace(String msg) {

       logger.trace(msg);

       writeTrace(msg);

   }

   

   public void debug(String msg) {

       logger.debug(msg);

       writeDebug(msg);

   }

   

   public void info(String msg) {

       logger.info(msg);

       writeInfo(msg);

   }

   

   public void warn(String msg) {

       logger.warn(msg);

       writeWarn(msg);

   }

   

   public void error(String msg) {

       logger.error(msg);

       writeError(msg);

   }

   

   public abstract void writeTrace(String msg);

   public abstract void writeDebug(String msg);

   public abstract void writeInfo(String msg);

   public abstract void writeWarn(String msg);

   public abstract void writeError(String msg);

   

}

Colored by Color Scripter

cs


4. MongoLogger.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

package com.ktds.smahn;

import org.slf4j.Logger;

import org.springframework.data.mongodb.core.MongoTemplate;

public class MongoLogger extends CustomLogger {

   private MongoTemplate mongoTemplate;

   

   private MongoLogger(Logger logger) {

       super(logger);

   }

   

   public MongoLogger(Logger logger, MongoTemplate mongoTemplate) {

       super(logger);

   }

   

   public MongoLogger(Logger logger, String mongoTemplateBeanName) {

       super(logger);

   }

   @Override

   public void writeTrace(String msg) {

       

   }

   @Override

   public void writeDebug(String msg) {

       

   }

   @Override

   public void writeInfo(String msg) {

       

   }

   @Override

   public void writeWarn(String msg) {

       

   }

   @Override

   public void writeError(String msg) {

       

   }

   

}

Colored by Color Scripter

cs



5. CustomLogger.java 수정

  • Protected 로 바꾸어준다. ( Protected : 상속 관계에서만 쓸 수 있다. CustomLogger를 상속받는 MongoLogger에서 쓸 수 있다. )


6. MongoLogger.java 추가


  1. 생성자 수정


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

public MongoLogger(Logger logger, String mongoTemplateBeanName) {

       super(logger);

       setMongoTemplate(mongoTemplateBeanName);

   }

   /* MongoContext안에 있는 mongoTemplateBean을 가지고 오기 */

   private void setMongoTemplate(String mongoTemplateBeanName) {

       

       // Session이 필요하다. 그러면 request가 필요하다. Spring에 깔려있는 request를 가져와서

       HttpServletRequest request =

               ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

       // 세션을 만든다.

       HttpSession session = request.getSession();

       // ServletContext 객체 가져오기

       ServletContext context = session.getServletContext();

       

       WebApplicationContext webContext = WebApplicationContextUtils.getWebApplicationContext(context);

       

       this.mongoTemplate = (MongoTemplate) webContext.getBean(mongoTemplateBeanName);

   }

Colored by Color Scripter

cs


  1. 로그 단계별로 구현


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

   @Override

   protected void writeTrace(String msg) {

       // 1. Level : TRACE, DEBUG, INFO, WARN, ERROR

       // 2. 시간 : 언제 찍혔나..

       // 3. 요청자  : 누가 찍었나..

       // 4. 로그 메시지 : 무엇을 찍었나..

       

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "TRACE");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");

   }

   @Override

   protected void writeDebug(String msg) {

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "DEBUG");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");

       

   }

   @Override

   protected void writeInfo(String msg) {

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "INFO");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");        

   }

   @Override

   protected void writeWarn(String msg) {

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "WARN");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");            

   }

   @Override

   protected void writeError(String msg) {

       Map<String, Object> log = new HashMap<String, Object>();

       log.put("LEVEL", "ERROR");

       log.put("DATETIME", new Date());

       log.put("REQUESTER", logger.getName());

       log.put("MESSAGE", msg);

       mongoTemplate.insert(log, "log");            

   }

Colored by Color Scripter

cs





7. ArticleController 클래스에서 선언해준다.


어디선가 만들어진 로그백을 받아와야하므로, 컨트롤러에서 로거를 생성해준다.


private Logger logger = LoggerFactory.getLogger(ArticleController.class);

private CustomLogger cLogger;



컨트롤러는 DAO(MongoTemplate)를 가져올 수가 없다. 그렇기 때문에 아래에 “mongoTemplate”에 써준것 처럼 bean id를 직접 준다. 그러면 setMongoTemplate이 실행되어 beanContext에서 mongoTemplate을 가지고 올 것이다.





이렇게 구현해준다.



8. 그리고 이제 한번 실행해보자.


콘솔에도 찍히고,


몽고디비에도 잘 찍힌다.





그런데 이렇게 하면 요청이 있어야만 Log를 불러올 수 있다. 아래와 같이 바꾸면 요청이 없어도 로그를 실행할 수 있다.


9. MongoLogger.java 수정




10. ArticleController 수정




Abstract class


  • Abstract 클래스를 이해하기 위해서는 인터페이스를 알아야한다.

  • 인터페이스란?  전체를 다 추상화 시켜놓고 전체를 다 구체화시키는 것.




이 것을 보고, 우리는 대략적으로 알 수 있다. 구체적으로는 알 수 없다. 즉, 추상화를 시켜 놓은 것이다. 그러면 여기에서 writeNewArticle 메소드를 보자.




위를 보면, 그 메소드를 구체적으로 구현해놓았다. 그러나 추상화 된 것끼리의 흐름이 없다.  이게 바로 인터페이스다. 그럼 이제 추상화를 보자.


  • 추상 클래스? 순서를 정해놓고 어떤 일을 할 건지를 구체화 시키는 것.

  • 낮은 추상화와 높은 추상화를 구분 짓는 기준은?

→ 순서가 있는지 없는지 여부.
    순서가 없다면 인터페이스를 쓰고, 순서가 없다면 추상 클래스를 쓰는 것이다.

  • 어떤 기능을 모아모아서 흐름을 만들어 놓음. 마치 소화가 되는 과정처럼. 그 과정 하나하나를 만들어주는 것을 추상클래스라고 부른다. 추상클래스는 우리가 필요한 것만 추상화시켜놓는다.


아래 예를 보자. 일단 추상 클래스의 trace 메소드를 보면 흐름이 있다. 먼저는 콘솔에 로그를 찍고, 그 후에는 DB에 trace 로거를 찍는 것이다.



      


이 추상 클래스는 구체적으로 메소드를 구현해놓지 않았다(추상메소드). extends하여 다른 클래스에서 구현한다. 아래와 같이!







#MongoDB + Oracle



1. MongoContext.xml 수정




2. OperationHistoryDAO 생성




3. ArticleBizImpl 에서 호출



4. articleContext.xml 추가



5. 결과


잘나온다.



'프로그래밍 > 빅데이터' 카테고리의 다른 글

[MongoDB] 설치, 개념  (0) 2016.05.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함