ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 마이블로그 ] 스프링 부트에 MongoDB 연결해서 db 가져오기
    마이블로그 2023. 7. 16. 23:26
    728x90

     

     

     

     

    Next.js로만 블로그를 구현하려다
    스프링 부트로 바꾸었고
    그래서 또! MongoDB를 새로 연결하는 작업을 했다.

     

    후... 처음엔 그냥 React와 express, Node.js로만 MongoDB 연결하고
    서버 사이드 렌더링(SSR) 때문에 Next.js 사용하기로 하고서
    Next.js와 MongoDB 연결

    후에 서버 전용 엔진을 사용하기로 변경해서
    스프링과 MongoDB를 연결..ㅎㅎㅎ

     

     

    스프링에는 application.properties 혹은 application.yml 파일이 존재한다.

    application.yml 파일은 이러한 형태로 적어준다.
    application.properties는 위와 같은 코드를
    spring.data.mongodb.host
    spring.data.mongodb.port
    이런 식으로 하나하나 다 적어줘야 하기 때문에
    귀찮아서 yml 파이로 변경하였다.

     


    host: 127.0.0.1은 localhost 주소이다. localhost라고 쓴 것과 같다.
    port:27017은 mongodb의 기본 주소이다. (데이터베이스들의 기본 포트 번호는 다 다르다!!!!)
    그리고 database는 mongoDB compass에서 요기의 이름을 적어주면 된다

     

     

    db 연결을 위한 세팅을 했으니
    이제 코드를 짜보자

     

    Mongodb template 혹은 Mongo Repository 둘 중 하나를 선택해서 db를 꺼내올 수 있다.
    template은 쉽게 말해 커스텀이 가능하지만 그만큼 손이 많이 가고
    Repository는 커스텀은 잘 안 되지만 기본적인 CRUD는 금방금방 작성할 수 있다.

     

    간단하게 User 컬렉션에 있는 db를 list로 끌어올 거니까 Repository로 구현해 보겠다.

     

    먼저 entity(mongodb에서는 collection)인 User 클래스를 작성한다.

    Getter, Setter, toString을 위해 @Data 어노테이션을 달아주고
    생성자 어노테이션도 달아주고
    @Document 어노테이션을 달고 collection을 지정해 준다.
    @MongoId는 ORM에서 pk 표시에 해당하며
    ObjectId 클래스는 Object의 Id 즉, ORM으로 치면 각 row가 갖는 id 값이라고 생각하면 된다.

     

     

    다음은 제일 중요한 MongoRepository!

    나는 entity와 일치하는 java 파일 하나, 그리고 db 검색 결과에 맞는 java 파일 하나.
    요렇게 작성하는 것을 선호하는 편이라
    UserResponseDto를 하나 더 만들었다. User 클래스와 정확히 일치하게 생성해 놨다.

    UserRepository 인터페이스를 만드는데 MongoRespository<클래스명, pk의 타입>을 상속받게 작성한다.

    findAll()이나 findUserByName 등의 이름은 해당 repository에서 자동으로 인식하는 규칙에 맞게 지은 메소드명이다.
    특히 세 번째 메소드인 ~~~Regex는 부분검색 용으로 좋다.(자세한 건 나중에)

     

     

    이제 Service를 작성해 보자

    UserRepository를 @Autowired 어노테이션을 사용하여 생성자 주입을 통해 bean을 생성해 준다.
    중간중간에 바로 return 하지 않고 users 변수를 만든 이유는
    log로 확인해 보려고 그런 것이니 바로 return에 userRepository~~를 적어도 상관없다!

     

     

    이제 컨트롤러!!
    거의 다 했다!!!

    컨트롤러 역시 생상저 주입으로 서비스 인스턴스를 생성.
    RequestMapping으로 기본 주소를 /user로 적어준다.

     

    url localhost:5000/user/all을 입력하면 findAll() 메소드가 실행되면서
    mongodb에 있는 3개의 db를 불러올 것이다.

    서버를 실행해서 확인해 보자!

     쟈자잔~~~~
    하.. 드디어 성공했다.
    사실 application.yml에 myBlog를 myblog로 잘못 적어놓고 3시간 동안 db를 꺼내오질 못 해서 낑낑댔다 하...
    내 소중한 3시간이 ㅠㅠㅠ

     

    findUserByName(String name) 함수는 이름에서도 알 수 있듯이 name과 일치하는 name을 갖는 document가 검색될 것이다.
    url localhost:5000/user/test/관리자로 입력해 보면

    쟈쟈잔~~~~
    name이 관리자인 document가 검색된다!!!!!

     

    그리고 findUserByNameRegex(String letter) 함수는 끝에 Regex를 적어줌으로써 ORM의 쿼리로 봤을 때 like '%letter%'와 같다고 볼 수 있다. Regex를 접미사로 붙여줘야 인식하니 주의!

    그래서 url localhost:5000/user/test/관으로 검색해 보면 이런 결과가 나온다.

    url localhost:5000/user/test/원으로 검색해보면 아래와 같다.

     

    다음은 CUD를 (부디) 성공해 보도록 하겠다!!!

     

     

     

     

    728x90
Posted by Program-mer.