블로그 이미지
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 31        

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.
2015.09.18 11:16 개발관련

spring roo 1.3.1 버전에서


1) Test 클래스에 @WebAppConfiguration 추가

2) pom.xml 의 servlet dependency 를  3.0.1로 변경


끝.

저작자 표시
신고
posted by Max.
2015.09.03 10:49 개발관련

여기저기 인터넷 자료를 보면, 쉽게 될것 같은데 안된다. 해서 정리한다.


먼저 swagger를 통해 하려고 하는 것이 http://petstore.swagger.io/ 여기처럼 만드는 것이다. API를 설명도 하고 테스트도 할수 있는 것인데, 자동 생성 툴을 이용해 해당 사이트를 쉽게 만들어 내면 된다.


크게 두가지를 해야 한다. 첫번째는 API 코드를 통해서 json을 생성하고, 두번째는 해당 UI 사이트 소스(html,js)를 웹서버에 올려야 한다. 후자는 단순히 https://github.com/swagger-api/swagger-ui 에서 소스코드를 내려받고 dist 에 있는 파일들을 웹서버(tomcat같은)에 올려 놓으면 끝이다. /webapp 아래에 적당히 위치하면된다.


이제 첫번째 json만 생성하면 된다. 이것을 생성하기 위해 제목의 springfox swagger2 를 이용하는 것이다. 3가지를 하고 local tomcat을 실행하면, json이 생성된다.


1. maven dependency 추가


<dependency>

   <groupId>io.springfox</groupId>

   <artifactId>springfox-swagger2</artifactId>

   <version>2.1.2</version>

</dependency>

<dependency>

<groupId>io.springfox</groupId>

<artifactId>springfox-swagger-ui</artifactId>

<version>2.1.2</version>

</dependency>   

<dependency>

   <groupId>com.fasterxml.jackson.core</groupId>

   <artifactId>jackson-databind</artifactId>

   <version>2.5.0</version>

</dependency>

혹시 찾지 못하면, repository를 추가한다.


   <repository>

     <id>jcenter-snapshots</id>

     <name>jcenter</name>

     <url>https://jcenter.bintray.com/</url>

   </repository> 


2. config java 파일 추가 


@Configuration

@EnableWebMvc

@EnableSwagger2

public class SwaggerConfiguration {


@Bean

public Docket api(){

   return new Docket(DocumentationType.SWAGGER_2)

   .select()

   .apis(RequestHandlerSelectors.any())

   .paths(springfox.documentation.builders.PathSelectors.regex("/api/.*"))

   .build()

   .apiInfo(apiInfo());

}

private ApiInfo apiInfo() {

   ApiInfo apiInfo = new ApiInfo("Api Documentation", "Api Documentation", "1.0", "urn:tos",

           "Contact Email", "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0");

   return apiInfo;

}

}

3. webmvc-config.xml에 bean 추가


<mvc:annotation-driven/>

<bean class="xxx.yyy.zzz.config.SwaggerConfiguration" />


이제 tomcat를 실행하면 아래와 같은 로그를 확인하고 json 위치를 호출해 본다. 


INFO ... Mapped "{[/v2/api-docs],methods=[GET]}"  ...

INFO ... Mapped "{[/swagger-resources]}" onto org ...

INFO ... Mapped "{[/configuration/ui]}" onto org. ...

INFO ... Mapped "{[/configuration/security]}" ont ...


로그 대로라면, http://localhost:8008/v2/api-docs 정도가 될것이고, swagger ui 사이트 상단 입력박스에 넣어서 확인할수 있다.


기본적인 연동은 이렇게 하고, 보다 상세한 고급기능은 해당 사이트에서 Reference를 참조하자. 끝.



저작자 표시
신고
posted by Max.
2015.08.07 10:39 개발관련

Roo 는 java8을 지원한다. https://spring.io/blog/2014/11/21/spring-roo-1-3-0-introduces-jdk-8-support 처럼 말이지... Roo 콘솔에서도 떡 하니, --java 에 8,9가 있고 명령을 실행해도 오류가 나지 않는다.


문제는 생성된 pom.xml 파일이 java 1.6으로 되어 있어서 1.8로 고치고 빌드 하면 오류가 없다. 하지만 톰캣으로 실행하면 spring 3.2.x 버전 때문에 java8에 대한 오류가 나온다. 다시 spring 4.x로 maven dependency를 바꾸면 이제야 오류없이 실행된다. 손이 많이 가는 Roo다. 자랑하는 '빠른 개발을 위한 것'은 이런것들이 잘 되었다는 가정이 있었다는게 함정인가? 


아무튼 현재는 Roo2.0 이 개발되고 있다(https://github.com/spring-projects/spring-roo/graphs/contributors). 아직 오류가 많아 쓰긴 힘들다. 


Roo는 내 기준으로 빠른 개발을 위한 무엇은 처음부터 없었다. 다른 장점들이 이것을 계속 쓰게하는 이유인데, 그것은 아주 오래전 일로부터 시작된 것이다.

저작자 표시
신고
posted by Max.
2015.07.14 08:26 분류없음


인터넷상에 자기의 생각을 표현한다는게 참 어렵게 느껴지는 요즘 입니다. 아마도, 자신의 글과 자신을 동일시 하는 경향때문에 그럴지도 모르겠습니다. 글과 자신은 많이 다른데 말입니다. 저도 가끔 글에 대한 이미지(아마 위와 같은 경향성 때문에...) 때문에 한줄짜리 글도 망설이는 것이 없지 않네요.


요즘 나 자신의 위치의 변화가 오면서 다시한번 신변잡기적인 개발에 관한 메모글을 올려 볼까 합니다. 개인적인 바램은 개발보다는 개발주윗것들에 대한 내용이 많았으면 합니다.


최근에 스팸을 차단된 블로그를 삭제 해 버릴까 하다가... 그동안 그랬던 것 처럼 갈겨 쓰는 메모장으로 활용하자... 라는 생각에 아침에 적어봤습니다.

저작자 표시
신고
posted by Max.
2015.06.09 15:06 개발관련

관련해서 누군가 비교해 놨는데(링크), FluentD가 그나마 선택할만하다고 한것 같다. FluentD는 CentOS에서 설치시, Ruby 컴파일러를 필요로 해서 보통은 td-agent라는 래핑된 데몬을 사용하는데, Plugin설치시 방화벽때문에 애를 먹을수도 있다.


저작자 표시
신고
posted by Max.
TAG FleuntD
2015.03.04 16:51 개발관련

1) VirtualBox 설치

    https://www.virtualbox.org/ 에서 다운로드


2) CentOS 6.6 설치

    http://isoredirect.centos.org/centos/6/isos/x86_64/ 에서 다운 받아 설치 

    (참조 : http://blog.daum.net/bang2001/114)


3) 네트워크 설정

    참조 : http://stormaa.tistory.com/77#recentTrackback

    이후 ssh 로 접속


4) JDK 설치

   wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.tar.gz


5) InfluxDB 설치

   wget http://s3.amazonaws.com/influxdb/influxdb-latest-1.x86_64.rpm

   rpm -ivh influxdb-latest-1.x86_64.rpm

   DB생성 : http://{host}:8083


6) FluentD 설치

   curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

   .플러그인설치

    - InfluxDB Plugin : /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-influxdb

    - redis Plugin : /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-redis-store

    - multiline Plugin : /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-tail-multiline-ex

  . conf 설정

  <source>

    type tail

    path /root/pa/tomcat/logs/test-json.log

    pos_file /var/log/td-agent/tmp/test-json.log.pos

    tag test.push

    format json

  </source>

  <match test.*>

   type influxdb

   dbname test_agent

   flush_interval 10s # for testing.

   host local2.test.com # (localhost by default)

   port 8086 # (8086 by default)

  </match>



7) app -> logging 테스트 실행


8) Grafana UI 확인



저작자 표시
신고
posted by Max.
2014.01.21 07:15 개발관련

여러경우가 있겠지만, 나같은 경우 data를 저장하는 곳이 개발, QA, LIVE 경로가 다른데, mongodb.conf 파일의 경로가 달라서 나왔다. 검색해보면, 로그 같은 파일경로가 다르거나, 권한 문제가 많은 것 같다.

저작자 표시
신고
posted by Max.