- 문제 상황 -
원래는 MySQL을 사용하고 있었는데 채팅 메세지를 적재하기 위해서 NoSQL인 DynamoDB를 연결했다. 그런데 연결만 했을 뿐인데 에러가 빵빵 터졌다.

에러 메세지를 보니 약간 Bean이 중복(?)되는 느낌인거 같았다.
- 해결 -
구글링 결과 JPA의 경우 default로 SpringBoot가 실행되면 컴포넌트 스캔으로 전체 패키지를 돌아 Entity와 Jpa를 사용하는 DAO단을 빈에 올린다. 그런데 DynamoDB랑 충돌이 일어난 것이었다.

그래서 우선 JPA를 사용하는 패키지와 DynamoDB를 사용하는 패키지를 분리하였다.
@RequiredArgsConstructor
@Configuration
@EnableJpaRepositories(basePackages =
{"com.example.matchup.matchupbackend.repository",
"com.example.matchup.matchupbackend.entity"})
@EnableConfigurationProperties({JpaProperties.class, HibernateProperties.class})
public class JPAConfig {
}
그리고 JPAConfig에서 컴포넌트 스캔 할 Entity와 Jpa를 사용하는 DAO단을 지정해 주었다.
@Configuration
@EnableDynamoDBRepositories(basePackages = "com.example.matchup.matchupbackend.dynamodb")
public class DynamoDBConfig {
@Value("${cloud.aws.access-key}")
private String awsAccessKey;
@Value("${cloud.aws.secret-key}")
private String awsSecretKey;
@Value("${cloud.aws.region.static}")
private String awsRegion;
public AWSCredentialsProvider amazonAWSCredentialsProvider() {
return new AWSStaticCredentialsProvider(amazonAWSCredentials());
}
@Bean
public AWSCredentials amazonAWSCredentials() {
return new BasicAWSCredentials(awsAccessKey, awsSecretKey);
}
@Bean
@Primary
public DynamoDBMapperConfig dynamoDBMapperConfig() {
return DynamoDBMapperConfig.DEFAULT;
}
@Bean
@Primary
public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig config) {
return new DynamoDBMapper(amazonDynamoDB, config);
}
@Bean
public AmazonDynamoDB amazonDynamoDB() {
return AmazonDynamoDBClientBuilder.standard().withCredentials(amazonAWSCredentialsProvider())
.withRegion(awsRegion).build();
}
static public class LocalDateTimeConverter implements DynamoDBTypeConverter<String, LocalDateTime> {
@Override
public String convert( final LocalDateTime time ) {
return time.toString();
}
@Override
public LocalDateTime unconvert( final String stringValue ) {
return LocalDateTime.parse(stringValue);
}
}
}
마찬가지로 DynamoDB에서도
@EnableDynamoDBRepositories(basePackages ="com.example.matchup.matchupbackend.dynamodb")
를 통해 스캔 할 범위를 지정해주었다.
이렇게 빈에 올릴 범위를 패키지를 통해 나누어 주니 에러가 해결되었다!
'기술적 고민 > Side Match' 카테고리의 다른 글
[SW마에스트로] CI/CD 구축 (Github Action, SCP) (0) | 2024.07.12 |
---|---|
[SW마에스트로] 프로젝트의 로그 관리하기 (Sentry) (0) | 2023.11.12 |
[SW마에스트로] 채팅 기능을 만들면서 하는 고민(DB 선정, 메세지 전송 방식) (4) | 2023.10.21 |
[SW마에스트로] Base64로 인코딩된 사진 받아서 S3에 업로드하기 (0) | 2023.10.07 |
[SW마에스트로] 팀원-팀원 상호 평가 API를 만들면서 하는 고민 (0) | 2023.09.12 |
- 문제 상황 -
원래는 MySQL을 사용하고 있었는데 채팅 메세지를 적재하기 위해서 NoSQL인 DynamoDB를 연결했다. 그런데 연결만 했을 뿐인데 에러가 빵빵 터졌다.

에러 메세지를 보니 약간 Bean이 중복(?)되는 느낌인거 같았다.
- 해결 -
구글링 결과 JPA의 경우 default로 SpringBoot가 실행되면 컴포넌트 스캔으로 전체 패키지를 돌아 Entity와 Jpa를 사용하는 DAO단을 빈에 올린다. 그런데 DynamoDB랑 충돌이 일어난 것이었다.

그래서 우선 JPA를 사용하는 패키지와 DynamoDB를 사용하는 패키지를 분리하였다.
@RequiredArgsConstructor
@Configuration
@EnableJpaRepositories(basePackages =
{"com.example.matchup.matchupbackend.repository",
"com.example.matchup.matchupbackend.entity"})
@EnableConfigurationProperties({JpaProperties.class, HibernateProperties.class})
public class JPAConfig {
}
그리고 JPAConfig에서 컴포넌트 스캔 할 Entity와 Jpa를 사용하는 DAO단을 지정해 주었다.
@Configuration
@EnableDynamoDBRepositories(basePackages = "com.example.matchup.matchupbackend.dynamodb")
public class DynamoDBConfig {
@Value("${cloud.aws.access-key}")
private String awsAccessKey;
@Value("${cloud.aws.secret-key}")
private String awsSecretKey;
@Value("${cloud.aws.region.static}")
private String awsRegion;
public AWSCredentialsProvider amazonAWSCredentialsProvider() {
return new AWSStaticCredentialsProvider(amazonAWSCredentials());
}
@Bean
public AWSCredentials amazonAWSCredentials() {
return new BasicAWSCredentials(awsAccessKey, awsSecretKey);
}
@Bean
@Primary
public DynamoDBMapperConfig dynamoDBMapperConfig() {
return DynamoDBMapperConfig.DEFAULT;
}
@Bean
@Primary
public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig config) {
return new DynamoDBMapper(amazonDynamoDB, config);
}
@Bean
public AmazonDynamoDB amazonDynamoDB() {
return AmazonDynamoDBClientBuilder.standard().withCredentials(amazonAWSCredentialsProvider())
.withRegion(awsRegion).build();
}
static public class LocalDateTimeConverter implements DynamoDBTypeConverter<String, LocalDateTime> {
@Override
public String convert( final LocalDateTime time ) {
return time.toString();
}
@Override
public LocalDateTime unconvert( final String stringValue ) {
return LocalDateTime.parse(stringValue);
}
}
}
마찬가지로 DynamoDB에서도
@EnableDynamoDBRepositories(basePackages ="com.example.matchup.matchupbackend.dynamodb")
를 통해 스캔 할 범위를 지정해주었다.
이렇게 빈에 올릴 범위를 패키지를 통해 나누어 주니 에러가 해결되었다!
'기술적 고민 > Side Match' 카테고리의 다른 글
[SW마에스트로] CI/CD 구축 (Github Action, SCP) (0) | 2024.07.12 |
---|---|
[SW마에스트로] 프로젝트의 로그 관리하기 (Sentry) (0) | 2023.11.12 |
[SW마에스트로] 채팅 기능을 만들면서 하는 고민(DB 선정, 메세지 전송 방식) (4) | 2023.10.21 |
[SW마에스트로] Base64로 인코딩된 사진 받아서 S3에 업로드하기 (0) | 2023.10.07 |
[SW마에스트로] 팀원-팀원 상호 평가 API를 만들면서 하는 고민 (0) | 2023.09.12 |