인프런 커뮤니티 질문&답변

리자몽님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 데이터 JPA

스프링 데이터 jpa 강의에서 에러 질문이요

21.12.05 14:08 작성

·

6.2K

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님의 프로필 이미지

2021. 12. 05. 14:38

안녕하세요. 리자몽님, 공식 서포터즈 OMG입니다.
올리신 에러메시지는 전체 메시지 중 일부인 것 같은데 

아래 링크에서 출력되는 메시지가 포함되어 있네요. 

Member테이블 생성문제 - 인프런 | 질문 & 답변 (inflearn.com)

 

h2 데이터베이스를 실행해주세요.

 

h2 db 실행 후에도 동일한 에러메시지가 출력될 경우 링크와 같이 전체 메시지를 남겨주세요

감사합니다.

리자몽님의 프로필 이미지
리자몽
질문자

2021. 12. 05. 15:10

감사합니다. 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

 

OMG님의 프로필 이미지

2021. 12. 05. 16:27

동일한 타입(MemberRepository)의 빈을 2개 등록해서 발생하는 문제입니다.

@Repository로 자동 빈 등록(컴포넌트 스캔의 대상)을 삭제 하여 해결이 된 것으로 보시면 됩니다.