Skip to content
Kang Log
Go back

다중 DB연결

Updated:

다중 DB연결

#프로젝트채팅

각각의 Entity에서 Getter Setter를 설정해 줘야 Controller에서 정보를 받아다가 매핑할때 알아서 변수이름대로 매핑이 된다.

다중 DB연결이 실시간 메시지 구현에 필요할것 같아 Config파일을 건드리는데 아무리 해도 잘 되지 않아서 제대로 찾아보고 연습해봤다. RMDBS 2개 연결 해보고 NoSQL 2개 연결해보고 마지막으로 네개를 한꺼번에 연결 해봤다.

RDBMS 과 NOSQL 이 Config 파일에 작성해야할 내용이 비슷한듯 사뭇 다르다

RDBMS은 datasource (데이터베이스 연결), entityManager(엔티티와 상호작용), transactionManager(트랜젝션 담당 객체) 가 DB와 연동할 때 필요하다 entityManger를 담당할 entity package에 맞게 세팅해주는 것이 중요하다

NOSQL은 MongoClient(mongodb cluster와 연결), mongoDatabaseFactory(클러스터 내부의 데이터베이스와 연결), mongoTemplate (특정 쿼리를담당하는 객체) 가 필요하다 RDBMS에 비해 세팅이 비교적 간단하다 (따로 릴레이션을 따질게 없어서 그런듯 하다 (그냥 클러스터, 데이터베이스 이름(nosql에선 collection이라부름, 그리고 템플릿만 정하면 됨))

RDBMS

1. DataSource()

역할

구성 요소

왜 필요한가?


2. EntityManager()

역할

구성 요소

JPA 속성 설정

왜 필요한가?


3. TransactionManager()

역할

구성 요소

왜 필요한가?

NO SQL

(1) MongoClient

(2) MongoDatabaseFactory

(3) MongoTemplate

RDBMS Config 예시

package com.kjh.fourdatabase.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;

@Configuration
@EnableJpaRepositories(
        basePackages = "com.kjh.fourdatabase.mysqldb1.repository",
        entityManagerFactoryRef = "firstEntityManager",
        transactionManagerRef = "firstTransactionManager"
)
public class FirstMysqlConfig {

    @Value("${spring.first-datasource.username}")
    private String username;

    @Value("${spring.first-datasource.password}")
    private String password;
    @Primary
    @Bean    public DataSource firstDataSource() {
        return DataSourceBuilder.create()
                .driverClassName("com.mysql.cj.jdbc.Driver")
                .url("jdbc:mysql://localhost:3306/testdb1?serverTimezone=Asia/Seoul")
                .username(username)
                .password(password)
                .build();
    }

    @Primary
    @Bean(name = "firstEntityManager")
    public LocalContainerEntityManagerFactoryBean firstEntityManager() {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(firstDataSource());
        em.setPackagesToScan("com.kjh.fourdatabase.mysqldb1.entity");
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());

        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", "update");
        em.setJpaPropertyMap(properties);
        return em;
    }

    @Primary
    @Bean(name = "firstTransactionManager")
    public PlatformTransactionManager firstTransactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(firstEntityManager().getObject());
        return transactionManager;
    }
}

NOSQL 예시

package com.kjh.fourdatabase.config;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration
@EnableMongoRepositories(
        basePackages = "com.kjh.fourdatabase.mongodb1.repository",
        mongoTemplateRef = "firstMongoTemplate"
)
public class FirstMongoConfig {

    @Primary
    @Bean    public MongoClient firstMongoClient() {
        return MongoClients.create("mongodb://localhost:27017");
    }

    @Primary
    @Bean    public MongoDatabaseFactory firstMongoDatabaseFactory() {
        return new SimpleMongoClientDatabaseFactory(firstMongoClient(),"testdb1");
    }

    @Primary
    @Bean    public MongoTemplate firstMongoTemplate() {
        return new MongoTemplate(firstMongoDatabaseFactory());
    }
}

MongoDB 쿼리

show dbs : 존재하는 데이터베이스 출력 use <db>: 해당 데이터베이스를 사용하겠다

show collections: 해당 데이터베이스에 존재하는 컬렉션들 출력 db.createCollection(“컬렉션이름”): 컬레션이름으로 컬렉션 생성 → NoSql 이라서 그냥 막 넣으면됨 db.insertOne({키: 값, 키: 값 …. }) : 해당 도큐먼트(레코드의 개념) 을 삽입

db.products.insertMany( { item: “card”, qty: 15 }, { item: “envelope”, qty: 20 }, { item: “stamps”, qty: 30 } ]); : 리스트로 도큐먼트를 넣어 한번에 삽입

등등 명령어 많음

[MONGO] 📚 몽고디비 CRUD 쿼리 문법 명령어 💯 정리


Share this post on:

Previous Post
인터페이스 구상
Next Post
첫시작 계획