[Spring] MySQL๊ณผ mongoDB ๋ฐ์ดํฐ๋ฒ ์ด์ค 2๊ฐ ์ฐ๋ํ๊ธฐ
๐ง ์ํฉ
ํ์ฌ ์ด์์ค์ธ Hous- (ํ์ฐ์ค) ๊ณต๋์ํ ๋์ฐ๋ฏธ ์๋น์ค์์ ๊ธฐ์กด์๋ MySQL๋ง์ ์ฌ์ฉํ๊ณ ์์์ต๋๋ค.
ํ์ง๋ง ๋ถํ์ํ๊ฒ ์์ด๋ ์ค๋๋ ์๋ฆผ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด์ผํ์ต๋๋ค.
๊ฐ๋ํ ๋ํ์์ด๊ธฐ ๋๋ฌธ์.. ์ฌ์ฉ์๊ฐ ์ฝ 200๋ช ์ ๋์ ๋ถ๊ณผํ๋ฐ ์ ๋ณด์ง๋ ์๋ ์๋ฆผ ๋ฐ์ดํฐ๊ฐ 10,000๊ฐ ์ด์ ์์ด๋..
์ด๋ ๊ฒ ๊ณ์ ํ์์๋ ๋ฐ์ดํฐ๊ฐ ์์ด๋ค ๋ณด๋ฉด AWS ํ๋ฆฌํฐ์ด ๊ธฐ์ค์ ์ด๊ณผํ ๊น๋ด ๊ฒ์ด๋ฌ๊ฑฐ๋ ์ ๐ฅฒ
์๋ฒ ํํธ ํ์๊ณผ ๋ ผ์๋ฅผ ํตํด
- Spring Batch๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ
- ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํด ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๋ ๋ฐฉ๋ฒ
- ๊ทธ๋ฆฌ๊ณ mongoDB๋ฅผ ๋์ ํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ์ต๋๋ค.
mongoDB์์๋ TTL index๋ฅผ ์ง์ํ์ฌ ๋ฐ์ดํฐ์ ์ ํจ๊ธฐ๊ฐ์ ์ค์ ํด์ ์ค๋๋ ๋ฐ์ดํฐ๋ ๋ณ๋์ ์ฒ๋ฆฌ ์์ด ์๋์ผ๋ก ์ง์์ง๊ฒ ํ ์ ์๊ฑฐ๋ ์!
Spring Batch๋ฅผ ํ์ฉํ๊ธฐ์๋ ๋ฐ์ดํฐ์ ์์ด ๋๋ฌด ์ ์ด์ ์ค๋ฒ์คํ์ด๋ผ๊ณ ํ๋จํ๊ณ ,
์ค์ผ์ค๋ฌ๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ ์๋ฒ์ ๋ถํ์ํ ๋ถํ๋ฅผ ์ค ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ํ mongoDB๋ฅผ ์ด๋ฒ ๊ธฐํ์ ๋์ ํ๋ค๋ฉด, NoSQL์ด ๋ ์ ํฉํ ๋๋ฉ์ธ๋ค์ ์ดํ์ ์ ํ์ ํด์ ์ฑ๋ฅ์ ๋ ๋์ผ ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค!
๊ทธ๋์ ์ ํฌ๋ mongoDB๋ฅผ ๊ธฐ์กด์ ์ฌ์ฉํ๋ MySQL๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๐ ์ฝ๋
โญ๏ธ 1. build.gradle ์์
mongoDB ๋์ ์ ์ํด์๋ ์ฒซ๋ฒ์งธ๋ก build.gradle ์ mongoDB ๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
dependencies {
// ...
runtimeOnly "mysql:mysql-connector-java"
implementation "org.springframework.boot:spring-boot-starter-data-jpa"
implementation "org.springframework.boot:spring-boot-starter-data-mongodb"
}
๊ฐ์ฅ ์๋ซ์ค์ด mongoDB๋ฅผ ์ถ๊ฐํ ๋ถ๋ถ์ ๋๋ค.
โญ๏ธ 2. Document ์ถ๊ฐ
MySQL์ ์ฌ์ฉํ ๋ @Entity ์ ๋น์ทํ ์ญํ ์ ํ๋ ๊ฒ์ด @Document ์ ๋๋ค.
@Column ๊ณผ ๋น์ทํ ์ญํ ์ ํ๋ ๊ฒ์ @Field ์ ๋๋ค.
@Document(collection = "notification")
public class Notification {
@Id
private String id;
@Field(name = "type")
private String type;
@Field(name = "content")
private String content;
@Field(name = "is_read")
private boolean isRead;
}
๋ค์๊ณผ ๊ฐ์ด Document ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ฃผ์ํ ์ ์ผ๋ก๋ mongoDB ์ ๊ฒฝ์ฐ, id ๋ฅผ String, ObjectId, BigInteger ์ค ํ๋๋ก ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค!
โญ๏ธ 3. Repository ์ถ๊ฐ
mongoDB์ ๊ฒฝ์ฐ, JpaRepository ๋์ MongoRepository ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
public interface NotificationRepository extends MongoRepository<Notification, String> {
}
โญ๏ธ 4. Config ํ์ผ ์ถ๊ฐ
Jpa ์ค์ ํ์ผ
@Configuration
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = "hous.core.domain.*.mysql")
public class JpaConfig {
}
mongoDB ์ค์ ํ์ผ
@Configuration
@RequiredArgsConstructor
@EnableMongoAuditing
@EnableMongoRepositories(basePackages = "hous.core.domain.*.mongo")
public class MongoDbConfig {
private final 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;
}
}
์ฌ๊ธฐ์ ์ฃผ์ ๊น๊ฒ ๋ด์ผํ ๋ถ๋ถ์
- @EnableJpaRepositories(basePackages = "hous.core.domain.*.mysql")
- @EnableMongoRepositories(basePackages = "hous.core.domain.*.mongo")
๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
basePackages ๋ฅผ ์์ธํ ๋ณด๋ฉด
JpaRepository ์ ๊ฒฝ์ฐ mysql ํจํค์ง๋ก ์ค์ ๋์ด์๊ณ ,
MongoRepository ์ ๊ฒฝ์ฐ mongo ํจํค์ง๋ก ์ค์ ๋์ด์์ต๋๋ค.
ํด๋น ์ค์ ์ ํตํด Spring ์ ๊ฐ๊ฐ์ repository ๋ค์
Jpa ์ค์ ์ ๊ธฐ์ค์ผ๋ก Bean ์ ๋ฑ๋กํ ์ง, mongoDB ์ค์ ๊ธฐ์ค์ผ๋ก Bean ์ ๋ฑ๋กํ ์ง ๊ตฌ๋ถ ํ ์ ์๊ฒ ๋ฉ๋๋ค!
ํจํค์ง ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
MappingMongoConverter ๋ ๋ถ๊ฐ์ ์ธ ์ค์ ์ ๋๋ค.
ํด๋น ์ค์ ์์ด ์คํํ๋ฉด _class ๊ฐ ์๋์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค์ ์ ๋๋ค.
(๊ถ๊ธํ์ ๋ถ๋ค์ ์ค์ ์ ์ง์ฐ๊ณ Document ๋ฅผ ํ๋ ์์ฑํด๋ณด์ธ์!)
โญ๏ธ 5. yml ํ์ผ ์์
๋ง์ง๋ง์ผ๋ก mongoDB ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: MySQL url
username: ์ ์ ๋ค์
password: ํจ์ค์๋
data:
mongodb:
uri: mongoDB uri
๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ฉด ๋์ ๋๋ค! ๐คฉ