SpringBoot 에서 mongoDB 연동하기

노문택·2022년 3월 22일
4

여태까지 SQL MAPPER VS ORM 이런식으로 해왓지만 이번엔

여러타입의 DB를 적응해보기 위해 작성했다..

Mysql 은 RDB 지만 mongoDB같은경우 NOSQL이고 최근 !! NOSQL 경험 사항이 있는지 올라오는 공채도 많이보인다..

아마 hdfs나 데이터 분산처리 하는 이유가 RDB 가 길어질수록 많아져서 하는데 처리하고 그값을 굳이 RDB에 넣을필요없이 NOSQL 에 넣고 처리하는게 맞다고 생각되서 그런가보다..

--- 여기까지는 사담이였고 진행 ㄱㄱ ---

그래들에 의존성 추가하자~

    implementation ('org.springframework.boot:spring-boot-starter-data-mongodb')

엥 님아 그래들은 딴데서 요러케하던뎅..

implementation ('org.springframework.boot:spring-boot-starter-data-mongodb-reactive')

그건 바로

전자의 경우는 mongoRepo 단독사용의 경우 그렇게한다 저렇게 선언하면 다른 DB나 그런걸못씀..

후자의경우는 REACTIVE 이므로 다른것도 킬수있다!

왠만하면 후자로 다하는것도 좋지만 mongoDB만 쓸 계획이면 전자로 진행해도 상관없다

요렇게 설정해주고 진행 ㄱ

yml 구조는 다음과 같다

spring:
  data:
    mongodb:
      host: 546.465.445
      port: 27017
      authentication-database: admin
      username: qweqwe
      password: 123
      database: qwerqwer
      # uri: mongodb: //546.465.445:27017/qwerqwer

값은 임의로 집어넣엇나 host에는 localhost 혹은 아이피를 넣고 알맞게 설정

authentication-database 의 경우 localhost내에서 접속시에는 필요없는것같지만 다른 ip에서 접속하려고하면 필자는 ..설정을 받아야 되더라..

롬복 셋팅 에러

에러가난다면.. 다음과같이 추가해주기..

    implementation('org.projectlombok:lombok')
    annotationProcessor ('org.projectlombok:lombok')

간단하게 서비스와 컨트롤러 만들어서 호출이 되는지 테스트 해보기

@RequiredArgsConstructor
@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class ShelterController {
    private final ShelterService shelterService;

    @GetMapping("api/shelter/find/earthquakes/{title}")
    public String findById(@PathVariable String title){
        System.out.println("test");
        return null;
        // return (ShelterNameSearchResponsseDto) shelterService.getShelterList(title);
    }
}

@RequiredArgsConstructor
@Service
public class ShelterService {

    public List<String> getShelterList(String title) {
        System.out.println("test");
        return null;
    }
}

실행결과는 이상없고 postman으로 가서 함호출해보기

야호 작동잘됨

필자 해당 몽고디비에는 저렇게 저장이 되있어서

entity 생성

public class Earchquakeshelter {
    @Id
    private String Eq_id;
    private Long Eq_num;
    private String Eq_name;
    private String Eq_address;
    private Long Eq_area;
    private Long Eq_long;
    private Long Eq_lat;
}

잠깐!!!

몽고 db쓸려는데 jpa방식을택한다고한다..그러나 우리가 간과한사실..

위와 같은 에러가 왜 발생햇는지 검색해보니 관련된 내용을 Spring Data JPA Doc에서 찾을 수 있었습니다. 로그와 같은 에러가 발생한 이유는 Spring-Data-JPA에서 언더스코어(_)가 프로퍼티을 찾기 위한 탐색 경로를 지정하는 예약어*이기 때문입니다.

라고한다.. 그래서 바꿔줘야되고 컬럼을 db에 저장되어있는 컬럼으로 맞춰줘야된다..

mongodb에는 한글로 들어가있어서 한글 변수명으로 작성해보도록한다..

@Document(collection = "earthquake_outdoor_csv_select")
@Getter
@NoArgsConstructor
public class Earthquakeshelter {

    @Id
    private String id;
    private Long 시설번호;
    private String 수용시설명;
    private String 상세주소;
    private Long 시설면적;
    private Long 경도;
    private Long 위도;
}

여기서 이제 갈림길이 갈린다

조회를 mongoTemplate으로 조회할지 // 혹은 직접 repo만들어서 조회할지

mongoTemplate같은경우 mongoDB에서 제공해주는 메소드들로 조회가능..

몽도 DB TEMPLATE 메소드인데 저거말고 더있는데... 흠...
나중에 시간이 되면 템플릿 쓰고 이번에는 REPO로 진행 ㄱㄱ

템플릿의경우 Service 단에서 템플리 선언하고 호출해주면 끝이다 ㅇㅇ;;

repo 사용을 하고 repo에서는 like %a%를 사용하기위해.. 열심히 찾아본결과 Regex라는 정규표현식을 사용하면된다

import java.util.List;
public interface ShelterRepo extends MongoRepository<Earthquakeshelter, String> {

        List<Earthquakeshelter> findBy수용시설명Regex(String title);
        }

서비스단은

@RequiredArgsConstructor
@Service
public class ShelterService {

    private final ShelterRepo shelterRepo;
    public ShelterNameSearchResponseDto getShelterList(String title) {
        String Regtitle = ".*" + title + ".*";
        System.out.println(Regtitle);
        List<Earthquakeshelter> earthquakeshelterlist = shelterRepo.findBy수용시설명Regex(Regtitle);
        return new ShelterNameSearchResponseDto(earthquakeshelterlist);
    }
}

이런식으로 필터링


@Getter
@NoArgsConstructor
public class ShelterNameSearchResponseDto {
    private List<Earthquakeshelter> earthquakeshelters;

    public ShelterNameSearchResponseDto(List<Earthquakeshelter> list){
        this.earthquakeshelters = list;
    }
}

response 선언해주고

controller 가서

@RequiredArgsConstructor
@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class ShelterController {
    private final ShelterService shelterService;

    @GetMapping("api/shelter/find/earthquakes/{title}")
    public ShelterNameSearchResponseDto findById(@PathVariable String title){
        System.out.println("test" + title);

         return (ShelterNameSearchResponseDto) shelterService.getShelterList(title);
    }
}

postman 에서 조회해서 테스트해보자..

예압 잘나옵니다 ㅎㅎ..

단어 + 단어로 이루어진것들 이런것들은 suffix array 를 이용하면 검색엔진을 좀더 능률적으로 만들수있지만 일단 1차적으로 여기서 마칩니당

profile
노력하는 뚠뚠이

0개의 댓글