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

리자몽님의 프로필 이미지

작성한 질문수

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

스프링 데이터 JPA

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

작성

·

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 실행 후에도 동일한 에러메시지가 출력될 경우 링크와 같이 전체 메시지를 남겨주세요

감사합니다.

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

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

 

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

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