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 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); } |
- 끝 -
'OpenSource > Spring Boot' 카테고리의 다른 글
ace-t의 Spring Boot 따라잡기(기본 - 예외처리) (0) | 2016.03.24 |
---|---|
ace-t의 Spring Boot 따라잡기(기본 - logging) (0) | 2016.03.24 |
ace-t의 Spring Boot 따라잡기(기본 - 외부톰캣 연동하기!) (0) | 2016.03.23 |
ace-t의 Spring Boot 따라잡기(기본 - SourceTree에 연결 및 Repository에 올리기) (0) | 2016.03.23 |
ace-t의 Spring Boot 따라잡기(기본 - 헬로우월드찍어보기!) (0) | 2016.03.22 |