블로그 이미지
Max.

calendar

            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            

Notice

2017.04.11 13:13 개발관련

데이터 생성 방법은 기존의 Biz 로직에 어떤 영향도 주지 않는 범위내에서 처리해야 하는 조건으로 진행되어야 한다.

1. log 처리

1) 소스코드에서 로그 수집 준비 작업

  • log4j 설정 추가
    • # JSON =============================================================#
      log4j.appender.JSON=org.apache.log4j.DailyRollingFileAppender
      log4j.appender.JSON.DatePattern='.'yyyy-MM-dd
      log4j.appender.JSON.File=${catalina.base}/logs/fluentd-json.log
      log4j.appender.JSON.layout=com.max.log4j.layout.FluentDJsonLayout
  • dependency 추가
    • <dependency>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
      <version>2.2.4</version>
      </dependency>
  • log4j Layout 확장
    • public class FluentDJsonLayout extends Layout {
           
          @Override
          public String format(LoggingEvent le) {
              return le.getMessage().toString().replaceFirst("__timestamp__", le.timeStamp+"")+"\n";
          }
       
          @Override
          public void activateOptions() {
          }
       
          @Override
          public boolean ignoresThrowable() {
              return false;
          }
      }
  • json Generator 생성
    • public class JsonGeneratorByApplication {
           
          private Gson gson = null;
           
          public String execute(Map<String,Object> r) {
              gson = new GsonBuilder().create();
              return gson.toJson(r).toString();
          }
       
          public String execute(String string, String string2) {
              gson = new GsonBuilder().create();
              Map<String,Object> r = new HashMap<String,Object>();
              r.put("timestamp""__timestamp__");
              r.put(string, string2);
              return gson.toJson(r).toString();
          }
       
          public String execute(String string, int string2) {
              gson = new GsonBuilder().create();
              Map<String,Object> r = new HashMap<String,Object>();
              r.put("timestamp""__timestamp__");
              r.put(string, string2);
              return gson.toJson(r).toString();
          }
      }
  • 대상 클래스 로그 코드 생성 
    • if(logger.isDebugEnabled()){
          Map<String, Object> r = new HashMap<String, Object>();
          r.put("timestamp""__timestamp__");
          r.put("gsp", GSP);
          r.put("appId", appId);
          r.put("appVersion", appVersion);
          r.put("osName", osName);
          r.put("osVersion", osVersion);
          r.put("server", server);
       
          logger.debug("{}",jsonGenerator.execute(r));
      }
  • 결과 생성 로그


저작자 표시
신고
posted by Max.
TAG fluentd
2015.09.22 17:34 개발관련

도메인 객체에서 아래와 같은 관계시

A -> B -> C

 1: n   1:n

A 객체만 가져와도 하위 객체 모두 가져오게 하는 방법은 아래와 같이 사용한다.

public String toJsonAll() {

    return new JSONSerializer().exclude("*.class").deepSerialize(this);

}


실제 쿼리는 객체와 매핑된 테이블에 대한 outer join으로 데이터를 가져온다.


이때 각 객체와의 관계에 대한 구현체가 Set 또는 List로 할수 있는데, JSONSerializer deepSerialize 메서드에서는 둘의 결과값에 차이가 있다.


@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

private Set<B> bs = new HashSet<B>();


or


@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)

private List<B> bs = new ArrayList<B>();


index 가 있는 List는 순회하는 만큼의 row가 들어가게 되고(JSONSerializer의 버그로 보인다), Set은 의도된 row만 들어있다. 


따라서 spring roo(1.3.1.R 버전) 를 사용한 JSONSerializer deepSerialize 사용시 1:n 관계에서는 List를 사용하면 안된다.



저작자 표시
신고
posted by Max.
2015.09.18 11:24 개발관련

1) 아래 처럼 도메인 객체 코드를 넣고(Array 예시)


    public static String toJsonArrayAll( Collection<XXX_SpuerDomain> collection ) {

        return new JSONSerializer().exclude("*.class").deepSerialize(collection);

    }


2) 아래처럼 리턴하면 된다.


return new ResponseEntity<String>(XXX_SpuerDomain.toJsonArrayAll(list),headers, HttpStatus.OK);  


3) 도메인 객체 자체가 복잡해서 선별된 의존관계 객체값만 리턴하고 싶다면, 아래처럼 기존에 생된된 메서드를 이용하는데 fields 값을 보내고 싶은 객체의 필드명을 넣으면 된다.


XXX_SpuerDomain.toJsonArray(collection, fields)


저작자 표시
신고
posted by Max.

티스토리 툴바