Spring boot와 mongoDB 연동하기 그리고 REST API


새삼스러운 이야기지만 Spring boot는 프로젝트 구성이 참으로 간편하다.

처음 STS에서 프로젝트 생성 시 Dependencies를 적절하게 선택하면 필요한 모든 라이브러리들이

알아서 착착 들어와주고 우리는 그저 그 라이브러리들을 적절히 사용하기만 하면 된다.


오늘 정리할 Spring boot와 mongoDB의  연동과 이를 테스트하기 위해 필요한 REST API 구현도

마찬가지이다.


그래서 어찌 보면 오늘 내용은 달리 설명할 부분이 없는 것이나 다름 없다.

아무래도 일반적인 지식으로 내용이 채워질 것이다.



1. 기능 목표


이번 주의 목표는 Spring boot와 mongoDB를 연동하여 Sign-up 정보를 mongoDB에

저장하고 이 정보를 이용하여 Login을 하는 것까지 구현을 하게 될 것이다.


2. 기술 목표


Spring boot와 mongoDB의 연동 및 이 과정에서 필요한 Spring boot에서의 REST API

구현에 대해 알아보도록 할 것이다.


3. 기술 적용 내용


  • Spring boot와 mongoDB 연동


Spring boot와 mongoDB의 연동 및 이 과정에서 필요한 Spring boot에서의 REST API

구현에 대해 알아보도록 할 것이다. 


우선 mongoDB는 설치가 된 것을 가정하고 설명을 진행한다. 나같은 경우  OSX에서 brew로

설치를 진행하고 설치 후 변경된 내용은 없다. 즉 가장 기본적인 상태로 설치가 되어있다.

그리고 Till60라는 이름의 DB를 하나 생성하였다. (MomgoDB를 인증모드로 접근하기 위한

설정 작업들이 있기는 하였으나 mongoDB 자체에 대한 설명을 하는 자리가 아니므로

‘4. 참조 (site 또는 서적)’ 항목에 링크로 대신한다.


내용을 단순하게 하기 위해 STS에서 새로 프로젝트를 생성하였다. Spring Starter Project를 

선택하였으며 Dependencies도 단순하게MongoDBWeb만을 선택하였다. 이렇게 생성했을 때 

gradle.build 파일의 dependencies는 다음과 같다.


dependencies {

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

compile('org.springframework.boot:spring-boot-starter-web')

testCompile('org.springframework.boot:spring-boot-starter-test')

}


그리고 application.properties에는 mongoDB 연결을 위한 uri를 다음과 같이 설정하였다.


spring.data.mongodb.uri=mongodb://mazdah:password@localhost:27017/Till60


사실상 설정은 이 것이 다라고 보면 된다.


  • Spring boot REST API 구현


이전의 개인프로젝트나 업무상의 작은 프로젝트에서는 주로 @RestController를 이용하여 REST API를

구현했었다. 그런데 이번에 @RepositoryRestResource라는 annotation을 새롭게 알게 되고 그

간편함에 끌러 사용하게 되었다. 물론 후에 또 어떻게 바뀔지는 모르겠지만…


우선 @RepositoryRestResource는 spring-data-rest-core 라이브러리에 정의되어있으며 이는

Spring Starter Project 생성시  Dependencies에 Rest Repositories를 선택하면 포함된다.


주의 사항

나같은 경우 현재 사무실과 집에서 Git으로 소스를 공유하면서 작업을 하고 있는데 두 곳의 STS 버전이

달라서 그런지 아니면 프로젝트 생성 후 별도로 라이브러리를 추가한 것이 꼬였는지 처음 사무실에서

@RepositoryRestResource를 사용했을 때 브라우저에서 계속 404 에러가 발생을 했다.

확인 결과 필요한 라이브러리 중 spring-data-rest-webmvc가 빠져있어서 발생을 한 문제였다.

기왕에 Spring boot를 사용하기로 했으면 필요한 라이브러리를 일일이 찾아 삽입하기 보다는

 처음 프로젝트 생성시 Dependencies를 잘 설정해주는 것이 불필요한 오류를 막는 지름길 일 것이다.


 

@RepositoryRestResources는 Repositary 인터페이스에 적용을 하게 되며 이렇게 할 경우

별다른 RestController 없이 기본적인 REST API를 자동으로 생성해준다. 이 때 자동으로 생성되는

REST API의 기본 형태는 다음과 같다.


http://domain:port/{domain}

http://domain:port/{domain}/{id}

http://domain:port/{domain}/search

http://domain:port/{domain}/search/{search query}


이 때 domain은 @Entity 또는 @Document 등으로 설정된 Domain 클래스이며 내부적으로

클래스명의 앞부분을 소문자로만든 후 뒤에 s를 붙여 사용하게 된다. 즉, Person이라는 Domain

Class를 만들었다고 한다면 {domain} 위치에는 persons로 표시된다.


{search quesry}에는 Repository 인터페이스에 선언된 쿼리 함수와 그 함수의 파라미터로 전달될

쿼리 문자열이 들어가게 된다. 만일  findByName(@Param(“name”) String name)이라는 

쿼리 함수가 선언되어있다면 {search quesry}는 다음과 같이 표현된다.


findByName?name={name}


Person domain 객체를 이용하여 이름이 “Edison”이라는 사람을 찾는다면 전체 URI는 다음과 같다.


http://domain:port/persons/search/findByName?name=Edison


참고로 URI의 구성에 영향을 미치는 요소가 2가지가 있는데 우선 REST API의 베이스 URI를

Spring boot의 application.properties에 spring.data.rest.base-path라는 항목에 값을

넣으면 된다. 만일 이 값을 api로 지정했다면 위의 URI는 다음과 같이 바뀌게 된다.


http://domain:port/api/persons/search/findByName?name=Edison


그리고 @RepositoryRestResources에 path 요소를 설정하게 되면 앞서 말한 domain 값이

path에 설정한 값으로 바뀌게 된다. 즉, @RepositoryRestResources(path=“user”)로

설정을 하게 되면 위의 URI는 다시 아래와 같이 바뀐다.


http://domain:port/api/user/search/findByName?name=Edison


이렇게 이번 주에는 가장 기본적인 설정을 통해 Spring boot와 mongoDB를 연동하고 

Sign-up과 Login 기능을 구현하게 되었다.


4. 참조 (site 또는 서적)


Spring Rest 참조

http://docs.spring.io/spring-data/rest/docs/current/reference/html/

https://brunch.co.kr/@sbcoba/3


MongoDB 관련 문서

http://blog.nekoromancer.kr/2013/12/16/mongodb-인증모드로-접속하기/

https://docs.mongodb.com/manual/reference/method/db.createUser/#db.createUser


MongoDB 관리 툴

https://docs.mongodb.com/ecosystem/tools/administration-interfaces/

https://www.humongous.io/app/


5. 확인 사항 (의문 사항)


이처음 생성하고 현재 프로젝트를 진행하고 있는 Till60 프로젝트의 경우 Run As > Spring Boot App

하여  서버 기동을 하게 되면 아래와 같은 로그가 계속 표시된다.


23:40:47.916 [cluster-ClusterId{value='584c13e54fe3502b024dca36', description='null'}-localhost:27017] DEBUG org.mongodb.driver.cluster - Checking status of localhost:27017

23:40:47.918 [cluster-ClusterId{value='584c13e54fe3502b024dca36', description='null'}-localhost:27017] DEBUG org.mongodb.driver.cluster - Updating cluster description to  {type=STANDALONE, servers=[{address=localhost:27017, type=STANDALONE, roundTripTime=1.1 ms, state=CONNECTED}]


아마도 클러스터로 구성된 mongoDB의 ping check를 하는 로그인 듯한데 얘가 어디서 출력을 하고

있는 것인지 잘 모르겠다. 로그에 찍힌 패키지명으로 추측컨대 mongo-deriver 또는 mongo-java-

Driver라는 라이브러리에서 찍히는 것 같은데 Referenced Library에는 해당 라이브러리가 포함되어

있지 않다. 아직도 기본 구조를 이해를 못하고 있어 애로 사항이 좀 있다…ㅠ.ㅠ


아마도 클러스터로 구성된 mongoDB의 ping check를 하는 로그인 듯한데 얘가 어디서 출력을 하고

있는 것인지 잘 모르겠다. 로그에 찍힌 패키지명으로 추측컨대 mongo-deriver 또는 mongo-java-

Driver라는 라이브러리에서 찍히는 것 같은데 Referenced Library에는 해당 라이브러리가 포함되어

있지 않다. 아직도 기본 구조를 이해를 못하고 있어 애로 사항이 좀 있다…ㅠ.ㅠ


6. 평가


서두에서도 말했지만 Spring boot는 우선 설정에 큰 신경을 쓰지 않아도 좋기 때문에 작업 시간을

꽤 많이 단축시켜준다. 하지만 그 구조를 이해하지 못하는 경우에는 상당한 혼란도 생길 수 있다.

모든 기술들이 그렇겠지만 우선은 그 기본적인 내용을 이해하고 사용을 해야 겠다는 생각을 새삼

하게 된다.


어쨌든 이번 주에는 어렵지 않게(물론 이해 못하는 부분이 있기는 하지만) mongoDB와 연동을

하여 기본적인 CRUD는 처리할 수 있게 되었다. 더 진도를 나가기 전에 mongoDB 모델링이

필요할 것 같다. 다음 주에는 mongoDB 모델링에 대해서 진행을 해 볼 것이다.

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^



변수명 맞추기...


잘 만들어지고 있던 사이트에 마지막 기능을 추가하는 중...
갑자기 등록과 수정(POST,PUT) 과정에서 400 Bad Request 오류가
발생을 한다.


다른 메뉴에서는 잘 되는 것으로 보아 설정의 문제는 아니고...
새로 구현된 기능에 국한된 문제인 듯싶은데...


반나절 이상을 날리면서 오늘 아침 겨우 찾아낸 문제의 원인은...
서버측 domain 클래스의 변수명과 등록/수정 시 넘기는
JSON 문자열의 변수명이 일치하지 않았던 것...ㅠ.ㅠ


서버쪽에서 변수명에 오타가 하나 있어 수정을 했는데
클라이언트쪽에서 수정을 안한 것이다.


참으로 소박한 실수였다...ㅠ.ㅠ

블로그 이미지

마즈다

이미 마흔을 넘어섰지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^