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

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.
prev 1 next

티스토리 툴바