mongo
를 실행하는 것은 mongo “mongodb://localhost:27017”
과 동일하다.mongo “mongodb://localhost:28015”
또는 mongo —port 28015
과 같이 사용하면 된다.이대로 설치만 하면 별도로 mongodb를 실행하지 않아도 사용하는 database를 삭제하지 않으면 데이터가 제대로 들어간다.
servlet-context.xml
<mongo:mongo-client id="mongoClient" host="localhost" port="27017"/>
<mongo:db-factory id="mongoDbFactory" dbname="blood" mongo-client-ref="mongoClient"/>
<beans:bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<beans:constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</beans:bean>
<beans:bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<mongo:repositories base-package="org.smu.blood.database" mongo-template-ref="mongoTemplate"/>
package org.smu.blood;
import java.util.Collection;
import java.util.Collections;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
@Configuration
public class MongoConfig extends AbstractMongoClientConfiguration{
@Override
protected String getDatabaseName() {
// TODO Auto-generated method stub
return null;
}
public MongoClient mongoClient() {
ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/blood");
MongoClientSettings mongoClientSettings = MongoClientSettings.builder().applyConnectionString(connectionString).build();
return MongoClients.create(mongoClientSettings);
}
public Collection getMappingBasePackages() {
return Collections.singleton("org.smu.blood");
}
}
@EnableMongoRepositories(basePackages = "com.baeldung.repository")
Spring Project에는 XML Configuration이나 Java Configuration 둘 중 하나만 넣어주면 된다.
<properties>
<java-version>1.8</java-version>
<org.springframework-version>5.3.15</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
[...]
<dependencies>
[...]
<!-- Spring Data MongoDB -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>3.3.1</version>
</dependency>
</dependencies>
<!-- MongoDB Java Driver -->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.4.0</version>
</dependency>
</dependencies>
<dependencies>
요소와 레벨이 같은 Spring Milestone repository for Maven 추가사용 가능한 mongodb-driver-sync 버전 확인
공식 문서 상에는 mongodb-driver-core가 필수인데 해당 dependency를 사용하면 MongoClient에서 오류가 발생해서 구글링으로 mongodb-driver-sync를 사용하라는 글을 보고 해당 artifact로 변경했더니 오류가 해결되었다.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="
http://www.springframework.org/schema/data/mongo
https://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="org.smu.blood">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
<!-- Default bean name is 'mongo' -->
<mongo:mongo-client host="localhost" port="27017"/>
</beans:beans>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="
http://www.springframework.org/schema/data/mongo
https://www.springframework.org/schema/data/mongo/spring-mongo.xsd
http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="org.smu.blood">
<!-- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/> -->
</context:component-scan>
<!-- Default bean name is 'mongo' -->
<mongo:mongo-client host="localhost" port="27017"/>
<mongo:db-factory id="mongoDbFactory"/>
<beans:bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<beans:constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</beans:bean>
</beans:beans>
package org.smu.blood.database;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
/*
* Spring Data MongoDB에서 User 클래스를 자동으로 User 이름의 collection에 매핑해서
* @Document annotation 사용하지 않아도 상관없음.
*/
@Document(collection="User")
public class User {
@Id
private String userId; // _id로 지정
private String password;
private String nickname;
public User() {}
public User(String userId, String password, String nickname) {
this.userId = userId;
this.password = password;
this.nickname = nickname;
}
public String getuserId() {
return userId;
}
public String getpassword() {
return password;
}
public String getnickname() {
return nickname;
}
public String toString() {
return String.format("User[userId:%s, password: %s, nickname: %s]", userId, password, nickname);
}
}
package org.smu.blood.database;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User, String>{
// query User
// userId는 unique한 _id(primary key)이기 때문에 userId로만 특정 User 검색 가능
@Autowired
public User findByUserId(String userId);
}
package org.smu.blood;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import org.smu.blood.database.UserRepository;
import org.smu.blood.database.User;
import static org.springframework.data.mongodb.core.query.Query.query;
import static org.springframework.data.mongodb.core.query.Criteria.where;
@Controller
public class UserController {
@Autowired
MongoTemplate mongoTemplate;
@RequestMapping(value="/signIn")
public String post(@RequestParam("userId") String userId, @RequestParam("password") String password, @RequestParam("nickname") String nickname, Model model) {
User user = new User(userId, password, nickname);
model.addAttribute("user", user);
return "viewPage";
}
@RequestMapping(value="/goBack")
public String goBack() {
return "home";
}
@RequestMapping(value="/save")
public String save(@ModelAttribute("user") User user, Model model) {
mongoTemplate.insert(user, "User");
User findUser = mongoTemplate.findOne(query(where("userId").is(user.getuserId())), User.class);
model.addAttribute("finduser", findUser);
return "save";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Welcome, ${user.nickname} <br>
userId: ${user.userId} <br>
password: ${user.password} <br>
nickname: ${user.nickname} <br>
<a href="save">save</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
saved. <br>
user id : ${finduser.userId } <br>
password : ${finduser.password } <br>
nickname : ${finduser.nickname } <br>
</body>
</html>
<mongo:db-factory id="mongoDbFactory" dbname="blood" mongo-client-ref="mongoClient"/>
에 dbname (현재 datbase 이름)을 제대로 명시해줘야 한다.
spring에서 보낸 데이터를 mongodb에 저장하는 것으로 연동이 제대로 되었음을 알 수 있고,
spring과 android를 연동한 이후 mongodb에 원하는 형태로 document에 데이터가 들어가도록 할 예정이다.
JWT (JSON Web Token) (0) | 2022.01.28 |
---|---|
[Spring] Android, Spring 연동 (retrofit2) (1) | 2022.01.24 |
[spring] Spring MVC: Model Interface, RequestParam Annotation, Spring MVC form (0) | 2022.01.19 |
[Spring] Spring MVC : Multiple view pages, Multiple Controllers (0) | 2022.01.18 |
[Spring] Eclipse Spring 개발 환경 구축 (0) | 2022.01.17 |