본문 바로가기

오류

[오류 정리]

1. RedisConfig basePackages 설정

***************************
APPLICATION FAILED TO START
***************************

Description:
Parameter 1 of constructor in com.example.common_module.domain.coolsms.service.SmsServiceImpl required a bean of type 'com.example.common_module.domain.coolsms.repository.SmsRepository' that could not be found.

Action:
Consider defining a bean of type 'com.example.common_module.domain.coolsms.repository.SmsRepository' in your configuration. Process finished with exit code 1

SmsRepository는 Redis DB의 Repository로 폴더 위치의 변경 이후에 오류 발생

Redis 재실행 -> 실패

 

ChatGPT

!!!!!!!!

 

@Configuration
@RequiredArgsConstructor
@EnableRedisRepositories(basePackages = "com.example.common_module") // Redis 레포지토리 기능 활성화
public class RedisConfig {
    private final RedisProperties redisProperties; // Redis 속성 정보 주입

    @Bean // 스프링 컨텍스트에 RedisConnectionFactory 빈 등록
    public RedisConnectionFactory redisConnectionFactory(){
        // LettuceConnectionFactory를 사용하여 Redis 연결 팩토리 생성, 호스트와 포트 정보를 사용
        return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort());
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // RedisTemplate 인스턴스 생성
        redisTemplate.setConnectionFactory(redisConnectionFactory()); // Redis 연결 팩토리 설정
        redisTemplate.setKeySerializer(new StringRedisSerializer()); // 키를 문자열로 직렬화하도록 설정
        redisTemplate.setValueSerializer(new StringRedisSerializer()); // 값을 문자열로 직렬화하도록 설정

        return redisTemplate; // 설정이 완료된 RedisTemplate 인스턴스를 반환
    }
}

basePackages설정 이후 잘 실행됨 ㅇㅇㅇㅇ ㅋ 

 

 

2. GlobalHandler 동일한 예외 두번 설정

Ambiguous @ExceptionHandler method mapped for [class org.springframework.dao.DataIntegrityViolationException]

 

    @ExceptionHandler(DataIntegrityViolationException.class)
    protected ResponseEntity<ErrorResponse> handleDuplicateInfoException(DataIntegrityViolationException ex) {
        log.error("handleDuplicateInfoException", ex);
        final ErrorResponse response = ErrorResponse.of(ErrorCode.DUPLICATE_INFO_ERROR, ex.getMessage());
        return new ResponseEntity<>(response, HTTP_STATUS_OK);
    }

 

    @ExceptionHandler(DataIntegrityViolationException.class)
    protected ResponseEntity<ErrorResponse> handleDataIntegrityViolationException(DataIntegrityViolationException e){
        log.error("handleDataIntegrityViolationException", e);
        final ErrorResponse response = ErrorResponse.of(ErrorCode.DUPLICATE_REQUEST_ERROR, e.getMessage());
        return new ResponseEntity<>(response, HTTP_STATUS_OK);
    }

 

Error Code 새로 설정하다가 밑에 있는거 못봄  -> 주석처리   

 

 

 

3. LogoutRepsitory 오류

 

Logout.java

@Setter
@Getter
@AllArgsConstructor
@Builder
@RedisHash("logout")
//@NoArgsConstructor
public class Logout {

    @Id
    private String id; // access_token

    private String data;

    @TimeToLive(unit= TimeUnit.SECONDS)
    private Integer expiration;
}

 

LogoutRepository

@Repository
public interface LogoutRepository extends JpaRepository<Logout, String> {
}

 

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'logoutRepository', defined in com.example.common_module.domain.member.repository.LogoutRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration, could not be registered. A bean with that name has already been defined in com.example.common_module.domain.member.repository.LogoutRepository defined in @EnableRedisRepositories declared on RedisConfig and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true


Process finished with exit code 0

 

Chatgpt

: @RedisHash를 사용한 엔티티의 레포지토리를 JpaRepository로 만들면 정상적으로 동작하지 않습니다. @RedisHash는 Redis 데이터베이스에 엔티티를 저장할 때 사용되는 어노테이션이고, JpaRepository는 관계형 데이터베이스(RDBMS)와 상호작용하기 위해 사용하는 Spring Data JPA의 레포지토리입니다.

 

두 가지의 핵심 차이점을 정리하자면:

  1. @RedisHash: 이 어노테이션은 Redis와 상호작용하기 위해 엔티티를 Redis에 저장할 수 있게 해줍니다.
  2. JpaRepository: JPA를 사용하여 관계형 데이터베이스에서 엔티티를 관리하는데 사용됩니다.

따라서, @RedisHash가 적용된 엔티티는 RedisRepository나 CrudRepository와 같은 Redis에 특화된 인터페이스를 사용해야 합니다.

 

@Repository
public interface LogoutRepository extends CrudRepository<Logout, String> {
}

 

CrudRepository 인터페이스로 변경하니 정상적으로 작동