[SpringBoot] CouchBase 연동하기
이전 글에서 NoSQL 을 로컬환경에 설치하는 것을 알아보았고, 해당 글에서는 SpringBoot 에서 CouchBase 를 연동해서 간단하게 테스트를 진행해보고자 합니다.
1. 환경 세팅
1-1. build.gradle
- CouchBase dependency 를 추가해줍니다.
implementation 'org.springframework.boot:spring-boot-starter-data-couchbase'
1-2. CouchBase 실행(Mac)
- 이전 글에서 Docker 를 통해 설치한 CouchBase 를 실행합니다.
docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase:community-7.1.1
- 만약 위 명령어를 먼저 진행하였다면, 아래 명령어로 컨테이너를 실행합니다.
$docker ps -a <-- 정지된 컨테이너 목록 조회
$docker start [컨테이너 이름]
1-3. CouchBase Bucket 생성
- CouchBase 를 실행 후 사용할 Bucket 을 생성합니다.
- [Buckets] 탭을 선택 후 [ADD BUCKET] 을 클릭하여 버킷을 생성합니다.
- 세팅은 기본 설정으로 생성합니다.
- 버킷 생성 이후 [Query] 탭을 선택 후 인덱스를 추가합니다.
CREATE PRIMARY INDEX ON couch_test;
2. 구현하기
- 프로젝트 구조는 아래 이미지와 같습니다.
2-1. config
- 먼저 CouchBase 를 SpringBoot 에서 사용하기 위해 접속 관련 Config 를 작성하겠습니다.
@Configuration
@EnableCouchbaseRepositories(basePackages={"com.example.couchbase"})
public class CouchBaseConfig extends AbstractCouchbaseConfiguration {
@Override
public String getConnectionString() {
return "couchbase://127.0.0.1";
}
@Override
public String getBucketName() {
return "couch_test";
}
@Override
public String getUserName() {
return "jaewon";
}
@Override
public String getPassword() {
return "112233";
}
}
- 위 설정들은 다음과 같습니다.
- getConnectionString()
- CouchBase 서버 URL 을 작성합니다.
- 해당 글에서를 로컬 환경에서 구동하였기 때문에 127.0.0.1 로 작성됩니다. - getBucketName()
- SpringBoot 에서 사용할 버킷 이름을 작성합니다.(위에서 생성한 버킷 이름) - getUserName()
- CouchBase 클러스터 생성 시 기입했던 Admin 계정의 UserName 을 작성합니다. - getPassword()
- CouchBase 클러스터 생성 시 기입했던 Admin 계정의 Password 를 작성합니다.
참고!!!
해당 파일은 CouchBase DB 에 Connection(연결)하는 설정 파일이므로 운영 환경에서는 외부에 노출되지 않도록 .gitIgnore 해주시거나 서버/계정 정보를 따로 property 로 관리하여 해당 파일을 gitIgnore 하시는 것이 좋습니다.
2-2. Controller
- 간단하게 저장, 조회 하는 기능을 구현하겠습니다.
@RestController
@RequiredArgsConstructor
public class CouchTestController {
private final CouchService couchService;
@GetMapping("/couch")
public List<Map<String, Object>> getList(String startDate, String endDate) {
List<CouchDto> couchDtoList = couchService.getList(startDate, endDate);
List<Map<String, Object>> couchList = new ArrayList<>();
for (CouchDto couchDto : couchDtoList) {
Map<String, Object> result = new HashMap<>();
result.put("grpNo", couchDto.getGrpNo());
result.put("pageNo", couchDto.getPageNo());
result.put("content", couchDto.getContent());
result.put("date", couchDto.getDate());
couchList.add(result);
}
return couchList;
}
@PostMapping("/couch")
public String setLog(@RequestBody CouchRequestDto couchRequestDto) {
couchService.setLog(couchRequestDto);
return "success";
}
}
- getList()
- 파라미터로 시작,종료 날짜를 전달 받아 해당 일자에 CouchBase 안의 리스트를 조회합니다. - setLog
- CouchBase 에 데이터를 저장합니다.
2-3. Service
- 컨트롤러에서와 같이 조회 및 저장하는 로직을 작성합니다.
해당 글에서는 다른 공부 중 RestTemplate 를 통해 OpenAPI 의 데이터를 저장하는 로직이 들어있습니다.
@Service
@RequiredArgsConstructor
public class CouchService {
private final CouchRepository couchRepository;
private static final String AUTH_KEY = "12345678";
/**
* get List
*/
public List<CouchDto> getList(String startDate, String endDate) {
List<CouchDto> couchDtos = new ArrayList<>();
List<CouchTest> couchTestList = couchRepository.findAllByDateBetween(startDate, endDate);
for (CouchTest couchTest : couchTestList) {
couchDtos.add(this.convertDocumentToDto(couchTest));
}
return couchDtos;
}
/**
* add log
*/
public void setLog(CouchRequestDto request) {
URI uri = UriComponentsBuilder
.fromUriString("http://어쩌구저쩌구")
.path("/couch/study")
.queryParam("auth", AUTH_KEY)
.queryParam("변수명", request.getGrpNo())
.queryParam("pageNo", request.getPageNo())
.encode()
.build()
.toUri();
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
couchRepository.save(this.createLogDocument(CouchDto.builder()
.grpNo(request.getGrpNo())
.pageNo(request.getPageNo())
.content(result.getBody())
.build()));
}
/**
* Dto -> Document 변환
*/
private CouchTest createLogDocument(CouchDto couchDto) {
return CouchTest.builder()
.grpNo(couchDto.getGrpNo())
.pageNo(couchDto.getPageNo())
.content(couchDto.getContent())
.date(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")))
.build();
}
/**
* Document -> Dto 변환
*/
private CouchDto convertDocumentToDto(CouchTest couchTest) {
return CouchDto.builder()
.grpNo(couchTest.getGrpNo())
.pageNo(couchTest.getPageNo())
.content(couchTest.getContent())
.date(couchTest.getDate())
.build();
}
}
2-4. Repository
- 다른 SpringData 에서 사용하는 것처럼 CouchBase 도 CrudRepository Interface 를 상속받아 사용합니다.
public interface CouchRepository extends CrudRepository<CouchTest, String> {
List<CouchTest> findAllByDateBetween(String startDate, String endDate);
}
- findAllByDateBetween()
- 시작/종료 날짜를 파라미터로 전달 받아 두 날짜 사이에 기록된 데이터를 조회.
2-5. Domain
- 실제 CouchBase Bucket 에 저장될 컬럼과 일치하도록 작성합니다.
@Builder
@Getter
@Document
public class CouchTest {
@Id
@GeneratedValue(strategy = GenerationStrategy.UNIQUE)
final String id;
@Field
String grpNo;
@Field
String pageNo;
@Field
String content;
@Field
String date;
}
2-6. DTO
- DTO 는 Request/Response 따로 분리하여 작성합니다.
- Request
@Builder
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class CouchRequestDto {
private String grpNo;
private String pageNo;
}
- Response
@Builder
@Getter
@Setter
@AllArgsConstructor
public class CouchResponseDto {
private String grpNo;
private String pageNo;
private String content;
private String date;
}
3. 테스트
- 테스트는 PostMan 을 통해서 진행합니다.
3-1. 데이터 저장
- PostMan 을 통해서 데이터를 저장하는 API 를 호출합니다.
- 정상적으로 호출이 되었다면, CouchBase Console의 [Document] 탭에서 데이터를 확인합니다.
3-2. 데이터조회
- 시작/종료 날짜를 파라미터로 전달하여 데이터를 조회합니다.
참고
- https://victorydntmd.tistory.com/349
- https://docs.spring.io/spring-data/couchbase/docs/current/reference/html/#reference