작성
·
6.3K
0
안녕하세요
스프링 데이터 jpa 부분을 수강하던중에
에러가 발생해서 질문합니다.. 구글링해봐도 해결책이 안나와서 질문합니다..
기존 JPA 강의까지는 에러없이 잘 실행 되던 코드가 SpringDataJpaMemberRepository 인터페이스를 추가하고 SpringConfig를 추가했더니 에러가 발생하네요..
우선 SpringConfig.java코드는 아래와 같습니다.
package com.example.hellospring;
import com.example.hellospring.repository.JdbcTemplateMemberRepository;
import com.example.hellospring.repository.JpaMemberRepository;
import com.example.hellospring.repository.MemberRepository;
import com.example.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.sql.DataSource;
@Configuration
public class SpringConfig {
// 스프링 데이터 jpa가 구현체를 만들어 놓은게 등록이됨
private final MemberRepository memberRepository;
@Autowired // 생성자가 하나인경우는 생략해도됨, 그러나 명시하는게 좋을듯
public SpringConfig(MemberRepository memberRepository) {
// 스프링 컨네이너에서 MemberRepository를 찾는다 근데 등록해 놓은게 ..SpringDataJpaMemberRepository
this.memberRepository = memberRepository;
}
@Bean
public MemberService memberService() {
// memberService에다 의존관계 셋팅을 해줘야함
return new MemberService(memberRepository);
}
}
또한
SpringDataJpaMemberRepository 부분은 다음과 같습니다.
package com.example.hellospring.repository;
import com.example.hellospring.domain.Member;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
// 스프링 데이터 JPA가 JpaRepository 를 상속받고 있으면
// SpringDataJpaMemberRepository 를 스프링 빈으로 자동 등록해준다 (구현체로 만들어서 등록을 해준다.)
// 이것을 SpringConfig에서 가져다 쓰면 된다.
@Override
Optional<Member> findByName(String name);
}
기존 jpa강의 까지
회원가입과 중복_회원_예외 부분이 에러없이 성공적으로 실행 됐습니다.
그런데 아래와 같은 에러가 발생합니다.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
참고로 application.properties 부분과
build.gradle 부분은 직전강의까지 잘 실행되던 부분에서 수정한게 없습니다..
혹시 몰라서 application.properties 부분과 build.gradle부분도 올리겠습니다.
application.properties 부분입니다.
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=none
build.gradle 부분입니다.
plugins {
id 'org.springframework.boot' version '2.4.12'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
// implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.h2database:h2'
// testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
test {
useJUnitPlatform()
}
감사합니다.
답변 1
0
안녕하세요. 리자몽님, 공식 서포터즈 OMG입니다.
올리신 에러메시지는 전체 메시지 중 일부인 것 같은데
아래 링크에서 출력되는 메시지가 포함되어 있네요.
Member테이블 생성문제 - 인프런 | 질문 & 답변 (inflearn.com)
h2 데이터베이스를 실행해주세요.
h2 db 실행 후에도 동일한 에러메시지가 출력될 경우 링크와 같이 전체 메시지를 남겨주세요
감사합니다.
동일한 타입(MemberRepository)의 빈을 2개 등록해서 발생하는 문제입니다.
@Repository로 자동 빈 등록(컴포넌트 스캔의 대상)을 삭제 하여 해결이 된 것으로 보시면 됩니다.
감사합니다. h2 데이터베이스를 실행시키니 다른 에러가 발생하는군요
그런데 검색해보니 MemoryMemberRepository에 있는
@Repository를 지워주면 정상작동한 다고해서
지워 줬더니 정상실행 됩니다..
참고로 아래는MemoryMemberRepository 에 @Repository가 있었을때 생기는 에러인데요..
왜 @Repository 가 있으면 이런 에러가 발생하는 것일까요?
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'springConfig' defined in file [C:\Users\taekg\IdeaProjects\SpringBootTraining\hello-spring\out\production\classes\com\example\hellospring\SpringConfig.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.hellospring.repository.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,springDataJpaMemberRepository
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.hellospring.repository.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,springDataJpaMemberRepository