티스토리 뷰
#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>
|
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);
} |
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) {
}
}
|
5. CustomLogger.java 수정
Protected 로 바꾸어준다. ( Protected : 상속 관계에서만 쓸 수 있다. CustomLogger를 상속받는 MongoLogger에서 쓸 수 있다. )
6. MongoLogger.java 추가
생성자 수정
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); } |
로그 단계별로 구현
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"); } |
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
- spring
- activity
- 뒤로가기 버튼
- 뉴스피드 가져오기
- jQuery
- mybatis
- 클래스
- 제이쿼리
- facebook 연동
- 메뉴바에 버튼 생성하기
- 포스팅하기
- ERD
- query
- Linear Layout
- er다이어그램
- 예외처리
- aop
- intent
- 자바프로그래밍
- 배열
- JSP
- sql
- 게시판 만들기
- Relative Layout
- MVC
- 글쓰기 버튼
- 쿼리
- 메소드
- mongo db
- Erwin
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |