Back-end/Spring

[Spring boot + MongoDB + MySQL] DB 2개 연동하기

moguogu 2022. 7. 26. 23:10

Springboot에 Mysql과 MongoDB 연결하기

1. 연결이유

프로젝트 중, RDBMS로 기본적인 것들은 다 구현해 놨는데, 서비스 배포시 사용자들의 로깅이나 결제 데이터가 쌓이면 Document기반인 관리하기 더 편한 NoSQL로 넣는게 좋을것 같다는 생각이 들었다

따라서 구조는 Springboot에 Mysql과 MongoDB둘다 연결되어 있는 구조이다

이번 글에서는 MongoDB에 AOP로 사용자 접근 로그를 저장하도록 하겠다

Collection이름은 user_history이다

2. 코드 

1) build.gradle 수정

가장 아랫줄 코드가 mongodb를 추가한 부분이다

 

2) User History Entity 수정 

//@Entity
@Document(collection="user_history")
@Getter @Setter
@NoArgsConstructor
public class UserHistory extends BaseTimeEntity{
    @Id
    private String id; //  id (Long -> String)
    private Long userId;//user id
    private String accessName; // 접근 이름
    private String accessPath; // 접근 경로
    private String ipAddress; // 아이피 주소
    private String loginDate; // 로그인 날짜
    private String osType; // os 종류
    private String sessionLastaccess; // 세션 마지막 접속
}

원래는 Entity였지만 이제는 Document 형태로 MongoDB에 들어가기 때문에 어노테이션을 수정해줬다 

id는 원래 Long 타입이였지만 String으로 변경해줬다 

 

3) Repository 수정 

@Repository
public interface UserHistoryRepository extends MongoRepository<UserHistory, String> {
}

Repository Interface 같은 경우에도 원래는 JpaRepository를 상속받아 사용했었다가 MongoRepository 를 받는다

 

4) 메인파일 수정 

@EnableJpaAuditing
@SpringBootApplication
@EnableAspectJAutoProxy
@EnableJpaRepositories(basePackages = "com.effitizer.start.repository")
@EnableMongoRepositories(basePackages = "com.effitizer.start.mongo")
public class StartApplication extends SpringBootServletInitializer {
	public static void main(String[] args) {
		SpringApplication.run(StartApplication.class, args);
	}
	@Bean
	public RequestContextListener requestContextListener(){
		return new RequestContextListener();
	}
}

Mongo Repository를 사용적용 해줄 범위를 지정해준다 

@EnableMongoRepository 어노테이션을 쓰고 위치를 지정해준다 

패키지위치는 그냥 repository랑 mongo로 두가지를 뒀다

경로는 위의 사진과 같다

5) application.yml 파일 수정

원래는 DB를 application.yml파일안에 url이랑 사용자정보, 비밀번호를 둘다 적어뒀었는데

DB를 두개 사용하면서 따로 관리하는 편이 좋을 것 같아서 바꿨다 

 

추가로 application-db.yml파일을 생성한다

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    url: jdbc:mysql://localhost:3306/effitizer?useUnicode=true&characterEncoding=utf8
    password:
  data:
    mongodb:
      #username: admin
      #password:
      uri: mongodb://localhost:27017/effitizer
      #authentication-database: admin

Mysql의 경우 datasource로 연결하고, mongoDB의 경우 data로 연결한다

 

6) Config파일 생성

@Configuration
public class MongoDBConfig {
    @Autowired
    private MongoMappingContext mongoMappingContext;

    @Bean
    public MappingMongoConverter mappingMongoConverter(
            MongoDatabaseFactory mongoDatabaseFactory,
            MongoMappingContext mongoMappingContext
    ) {
        DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
        MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return converter;
    }
}

config는 사실 필수가 아닌데, 이 코드가 없이 실행하면 _class 컬럼이 자동으로 생성된다

따라서 그걸 방지하기위해 위와 같이 코드를 작성한 것이다 

3. 결과

studio 3T GUI를 활용하여 결과를 조회했다

프로젝트를 빌드하니까 테이블이 생기고 접근기록이 잘 기록되는 것을 확인할 수 있었다 

 

4. 고찰

Nosql을 사용하면서 id를 Long이 아니라 string으로 해야 자동으로 생성되는 것을 몰라서 오류를 겪었었다 

@GeteratedValue설정을 검색해서 옵션을 바꿔가면서 해봤는데 결국 String으로 바꾸는게 답이었다

'Back-end > Spring' 카테고리의 다른 글

[JPA] jpa 2일차  (0) 2021.07.27
[JPA] jpa 1일차  (0) 2021.07.27