ace-t의 Spring Boot 따라잡기(기본 - CouchBase 연동하기)

2016. 3. 24. 11:16OpenSource/Spring Boot

반응형



2016/03/23 - [OpenSource/Spring Boot] - ace-t의 Spring Boot 따라잡기(기본 - 외부톰캣 연동하기!)


Rest api + CouchBase 연동

CouchBase 셋팅은 따로 다루지 않겠습니다.

이미 셋팅이 되어있다는 전제하에 진행합니다.


1) build.gradle의  dependency 추가

    compile('org.springframework.data:spring-data-couchbase:2.0.0.RELEASE') 를 추가.


2) Controller 작성

  • Controller 작성 후 Service를 호출하는 방식이 보통 MVC 패턴이며, Repository라는 interface를 implements하여 Service에서 구현해 나가는 구조 입니다. 또한 couchbase의 config관련도 필요합니다.
  • Controller 뼈대 코딩 후 필요한 Config -> Interface -> Service 순으로 만들어 가겠습니다.
  • Restful api 방식은 @RestController와 @PathVariable를 통해 간단하게 구현할 수 있습니다. 단, Restful은 아키텍처를 따로 공부하여 업무에 맞게 알맞게 구현해보세요~
  • add source

import com.kakaocorp.www.api.service.LineupDataService;

import com.kakaocorp.www.api.config.CouchBaseConfig;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;


import java.util.List;

import java.util.Map;


@RestController

public class LineupDataController {

    @Autowired

    CouchBaseConfig couchBaseConfig;

    @Autowired

    LineupDataService lineupDataService;


    @RequestMapping(value = "/{version}/findAll", method = RequestMethod.GET)

    public List<Map<String, Object>> getStaticData(@PathVariable String version, @RequestParam String query, @RequestParam(defaultValue = "mobile") String platform){

        if("v1".equals(version)){

            return lineupDataService.findAll(couchBaseConfig, query, platform);

        }

        return null;

    }


}



3) CouchBaseConfig.java 생성

  • extends AbstractCouchbaseConfiguration
  • add source

    @Override    
    protected List<String> getBootstrapHosts() {

        return Arrays.asList("couchbase ip or domain");

    }



    @Override

    public String getBucketName() {

        return "wirite bucket name";

    }


    @Override

    protected String getBucketPassword() {

        return "";

    }


    @Bean

    public Bucket contextBucket() throws Exception {

        return couchbaseCluster().openBucket("wirite bucket name", "");

    }


    @Bean(name = "contextTemplate")

    public CouchbaseTemplate contextTemplate() throws Exception {

        CouchbaseTemplate template = new CouchbaseTemplate(couchbaseClusterInfo(), //reuse the default bean

                contextBucket(), mappingCouchbaseConverter(), translationService() //default beans here as well

        );

        template.setDefaultConsistency(getDefaultConsistency());

        return template;

    }

 

3) CouchBaseDataReposiry interface를 하나 만듭니다.

  • 원하는 기능을 interface에 넣고 service에서 재구현할 것이다.
  • add source

import java.util.List;

import java.util.Map;

public interface CouchBaseDataRepository {

    public List<Map<String, Object>> findAll(final CouchBaseConfig couchBaseConfig, final String searchKeyword, String platform);

} 



4) CouchBaseDataService.java 생성

  • 위에서 만든 interface를 implements 하여 구현 합니다.
  • add source : N1ql을 사용 함.

아래의 소스는 프로토타입으로 간단하게 구현되었음. 무조건 실행! 아래의 소스를 바탕으로 확장하시면 됩니다.

참고 : http://developer.couchbase.com/documentation/server/4.0/n1ql/n1ql-intro/data-access-using-n1ql.html

import com.couchbase.client.java.query.N1qlQuery;

import com.couchbase.client.java.query.N1qlQueryResult;

import com.couchbase.client.java.query.N1qlQueryRow;

import com.couchbase.client.java.query.Statement;

import com.couchbase.client.java.query.dsl.path.AsPath;

import com.kakaocorp.www.api.config.CouchBaseConfig;

import com.kakaocorp.www.api.repository.CouchBaseDataRepository;

import org.springframework.dao.DataRetrievalFailureException;

import org.springframework.stereotype.Service;


import java.util.ArrayList;

import java.util.List;

import java.util.Map;


import static com.couchbase.client.java.query.Select.select;

import static com.couchbase.client.java.query.dsl.Expression.i;

import static com.couchbase.client.java.query.dsl.Expression.s;

import static com.couchbase.client.java.query.dsl.Expression.x;


@Service

public class LineupDataService implements CouchBaseDataRepository {


    @Override

    public List<Map<String, Object>> findAll(CouchBaseConfig couchBaseConfig, final String searchKeyword, String platform) {

        Statement query;


        AsPath prefix = select("D, H, P").from(i(couchBaseConfig.getBucketName()));

        query = prefix.where(x("QUERY").eq(s(searchKeyword)).and("PLATFORM").eq(s(platform)));


        logQuery(query.toString());

        N1qlQueryResult result = null;

        try {

            result = couchBaseConfig.contextBucket().query(N1qlQuery.simple(query));

        } catch (Exception e) {

            e.printStackTrace();

        }

        return extractResultOrThrow(result);

    }


    private static List<Map<String, Object>> extractResultOrThrow(N1qlQueryResult result) {

        if (!result.finalSuccess()) {

            //log.warn("Query returned with errors: " + result.errors());

            throw new DataRetrievalFailureException("Query error: " + result.errors());

        }


        List<Map<String, Object>> content = new ArrayList<Map<String, Object>>();

        for (N1qlQueryRow row : result) {

            content.add(row.value().toMap());

        }

        return content;

    }


    /**

     * Helper method to log the executing query.

     */

    private static void logQuery(String query) {

        //log.info("Executing Query: {}", query);

    }

 

  - 끝 -



반응형