๐๏ธMongoRepository vs MongoTemplate
MongoDB๋ NoSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, ๊ทธ ์ ์ฐ์ฑ ๋๋ถ์ Spring Boot์ ์์ฃผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. Spring Boot์์๋ Spring Data MongoDB๋ฅผ ํตํด MongoDB ์ฐ๋์ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค. Spring Data MongoDB๋ ๋ ๊ฐ์ง ์ฃผ์ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋กย MongoTemplate์ย MongoRepository ์ ๋๋ค. ย ์ด๋ฒ ํฌ์คํ ์์๋ ์ด ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋น๊ตํ๊ณ , ์ด๋ค ์ํฉ์์ ๊ฐ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค. ย [MongoRepository] MongoRepository๋ ๋ ํ์งํ ๋ฆฌ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ธํฐํ์ด์ค์ ๋๋ค. ๊ธฐ๋ณธ์ ์ธ CRUD ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์ ๊ณตํฉ๋๋ค. Spring Data JPA์ ๋น์ทํ๊ฒ ์๋ํ๋ฉฐ, MongoDB ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ย ์ฅ์ * ๊ธฐ๋ณธ์ ์ธ CRUD ์์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌ * ์ฝ๋๊ฐ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์ * ๋ฉ์๋ ์ด๋ฆ๋ง์ผ๋ก ์ปค์คํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ (ex. findByCategory) ๋จ์ * ๋ณต์กํ ์ฟผ๋ฆฌ ์์ ์์๋ ์ ํ์ * ์ปค์คํฐ๋ง์ด์ง์ด ์ด๋ ต๊ณ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ์ ํ๊ณ๊ฐ ์์ ย [MongoTemplate] MongoTemplate์ Spring์ ํ ํ๋ฆฟ ํจํด์ ์ฌ์ฉํ MongoDB ์ฐ๋ ๋ฐฉ์์ ๋๋ค. ๋ ๋ณต์กํ MongoDB ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ์ด๋ ค์ด ์ฟผ๋ฆฌ ์์ฑ์ ์ ํฉํฉ๋๋ค. ย ์ฅ์ * ๋ณต์กํ ์ฟผ๋ฆฌ๋ ์ปค์คํ ์์ ์ ๋ ์ฝ๊ฒ ์ํ ๊ฐ๋ฅ * MongoDB์์ ๊น์ด ์๋ ์ํธ์์ฉ์ ์ ํฉ * ๋ ์ธ๋ฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ์ด๊ฐ ๊ฐ๋ฅ ๋จ์ * ๊ธฐ๋ณธ์ ์ธ CRUD ์์ ๋ ์ฝ๋๋ก ์ง์ ์์ฑํด์ผ ํ๋ฏ๋ก ์ฝ๋๊ฐ ๋ค์ ๋ณต์กํด์ง * ๋ ํ์งํ ๋ฆฌ ํจํด๋ณด๋ค ๋ค์ ๋นํจ์จ์ ์ผ ์ ์์ ย [MongoRepository ์ฌ์ฉ ์์] Product ์ํฐํฐ @Document(collection = "products") public class Product { @Id private String id; private String name; private String category; } ProductRepository ์ธํฐํ์ด์ค public interface ProductRepository extends MongoRepository { List findByCategory(String category); } MongoRepository๋ฅผ ํ์ฅํ ProductRepository๋ฅผ ์ ์ํ์์ต๋๋ค. CRUD ๋ฉ์๋๋ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ฉฐ, ์ปค์คํ ์ผ๋ก findByCategory ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. ย CRUD ์์ ์ฌ์ฉ ์์ @Autowired private ProductRepository productRepository; public void addProduct(Product product) { productRepository.save(product); } public List getProductsByCategory(String category) { return productRepository.findByCategory(category); } ์ด์ฒ๋ผ MongoRepository๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ CRUD ์์ ์ ๋งค์ฐ ์ง๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ย [MongoTemplate ์ฌ์ฉ ์์] ์ด๋ฒ์๋ ๊ฐ์ Product ์ํฐํฐ๋ฅผ ์ฌ์ฉํ์ฌ MongoTemplate์ ์ด์ฉํ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ย MongoTemplate์ผ๋ก ๋ณต์กํ ์ฟผ๋ฆฌ ์์ฑ @Autowired private MongoTemplate mongoTemplate; public List findProductsByCategory(String category) { Query query = new Query(); query.addCriteria(Criteria.where("category").is(category)); return mongoTemplate.find(query, Product.class); } ์ ์ฝ๋์์๋ MongoTemplate์ ์ฌ์ฉํ์ฌ MongoDB ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํ์ต๋๋ค. Criteria์ Query ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ ๋ณต์กํ ์ฟผ๋ฆฌ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ย CRUD ์์ ์ฒ๋ฆฌย public void addProduct(Product product) { mongoTemplate.save(product); } public Product getProductById(String id) { return mongoTemplate.findById(id, Product.class); } MongoTemplate์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ์ง๋ง, ๊ทธ๋งํผ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค. ย [์ด๋ค ๊ฒ์ ์ ํํด์ผ ํ ๊น?] MongoRepository๋ฅผ ์ฌ์ฉํด์ผ ํ ๋: * ๊ธฐ๋ณธ์ ์ธ CRUD ์์ ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๋ * ์ฝ๋์ ๊ฐ๊ฒฐํจ๊ณผ ์ ์ง๋ณด์์ ์ฉ์ดํจ์ด ์ค์ํ ๋ MongoTemplate์ ์ฌ์ฉํด์ผ ํ ๋: * ๋ณต์กํ ์ฟผ๋ฆฌ๋ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ * ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ ์ธ๋ฐํ ์ํธ์์ฉ์ด ํ์ํ ๋ ย [๊ฒฐ๋ก ] MongoDB์ Spring Boot์ ์ฐ๋์์ MongoRepository์ MongoTemplate์ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฉ๋์ ๋ง์ถฐ ์ค๊ณ๋ ๋๊ตฌ์ ๋๋ค. ์ ๋ ์ค์ ํ๋ก์ ํธ์์ bulk upsert ๊ธฐ๋ฅ์ด ํ์ํ ์ํฉ์ ๊ฒช์๋๋ฐ, MongoRepository์๋ ํด๋น ๊ธฐ๋ฅ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋์ง ์์, ๋ ์ ์ฐํ MongoTemplate์ ์ฌ์ฉํ ์๋ฐ์ ์์์ต๋๋ค. ๋ฌผ๋ก upsert๋ฅผ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋ ๋ฐฉ๋ฒ๋ ๊ฐ๋ฅํ์ง๋ง, ์ด๋ ๋นํจ์จ์ ์ด๋ฏ๋ก MongoTemplate์ ํตํด ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์์์ต๋๋ค. ย ๋ฐ๋ฉด, ๋จ์ํ ์กฐํ ์์ ์์๋ MongoRepository๋ฅผ ์ฌ์ฉํ์ต๋๋ค. MongoTemplate๋ณด๋ค ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ๊ฐ ์ฌ์ ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ฒ๋ผ MongoRepository๋ ๊ธฐ๋ณธ์ ์ธ ์์ ์ ์ต์ ํ๋์ด ์๊ณ , MongoTemplate์ ๊ณ ๊ธ ์์ ์์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ย ๊ฒฐ๊ตญ ์ค์ํ ๊ฒ์ ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ ์ด ๋ ๋ฐฉ์์ ์ ์ ํ ์ ํํ๊ฑฐ๋ ํผํฉํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ฐ ๋๊ตฌ๊ฐ ์ ๊ณตํ๋ ์ฅ์ ์ ์ต๋ํ ํ์ฉํด, ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ์๋ฃจ์ ์ ์ฐพ๋ ๊ฒ์ด ์ฑ๊ณต์ ์ธ MongoDB ์ฐ๋์ ํต์ฌ์ ๋๋ค.