BackEnd/Spring

[SpringBoot] CouchBase 연동하기

Wonol 2022. 11. 27. 16:05
반응형

이전 글에서 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

- https://m.blog.naver.com/fkdltmxlr3/222155144319

반응형