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

백치둥님의 프로필 이미지
백치둥

작성한 질문수

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

JPA

em에서 널포인트 에러가 뜹니다..

작성

·

1.5K

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
EntityManager 변수인 em에서 널포인트 오류가 떴는데
강의 한번 더 보면서 코드 똑같이 쳤는지 확인도 한 번 더 하고
소스 복붙 했는데도 이 오류가 떠요 ㅠㅠ

답변 6

3

백치둥님의 프로필 이미지
백치둥
질문자

안녕하세요!!! 드디어 해결했는데, 총 두가지 문제가 있었어요. codeweaver님께서 말씀해 주신 것처럼 @PersistanceContext 어노테이션 붙이고

jpa수업 교제에 있는 코드 대조해가면서 찾았는데 Member클래스에 강의에 나와있던 @Colum(name = "username")가 없더라고요? 그래서 없애니까 됐어요!! 저것들이 왜 에러를 일으켰는지 모르겠습니다 ㅜㅠㅠ

안녕하세요 백치둥님!

문제가 해결되어서 다행입니다.

.

우선, SpringConfig 에 @Configuration 애노테이이 붙어있습니다. 그렇게 되면 스프링 애플리케이션이 실행될 때 이 SpringConfig 안에 있는 @Bean 애노테이션이 붙은 메서드에서 제공하는 객체들을 스프링 컨테이너에 등록하게 됩니다. 문제가 되었던 JpaMemberRepository 도 이 때 스프링 컨테이너에 등록됩니다.

문제는, 코드를 보면, new JpaMemberRepoitory(em); 으로 직접 EntityManager를 주입하고 있습니다. 그래서 EntityManager 가 선언된 필드를 보면, 아무 애노테이션도 붙어있지 않습니다. 그리고 수동으로 직접 EntityManager를 생성하고 있는 부분도 없습니다. 그래서 new JpaMemberRepository(null); 로 작동하여 NullPointerException이 발생합니다.

.

EntityManager는 수동으로 관리하기 보단, 스프링이 관리하도록 위임하고 사용하는것이 일반적입니다. 그래서 스프링이 제공하는 EntityManager를 사용하기 위해선 @Autowired 혹은 @PersistenceContext 애노테이션을 붙여주셔야 합니다.

그러면 스프링 애플리케이션이 실행될 때, 컴포넌트 스캔을 하게 되고, @Configuration 을 발견하겠죠? 이때 필드에 @PersistenceContext 애노테이션이 붙은 EntityManager를 발견하게 되고, 스프링이 관리하는 EntityManager를 여기에 주입해줍니다. 그래서 이떄는 null이 아닌 값이 JpaMemberRepository에 전달되는것 입니다.

.

감사합니다.

아! 추가로 

application.properties 파일에 ddl-auto 부분을 none 으로 설정하셨더라구요.

그렇게 되면 엔티티에서 필드명을 바꾸거나 했을때 데이터베이스 테이블이 새로 생성되지 않아 문제가 생길수 있습니다. 이 설정을 개발단계에서는 create 로 두시는것을 추천드립니다.

.

감사합니다.

3

백치둥님 안녕하세요! 원인을 찾았습니다.

지금 애플리케이션에서 SpringConfig.java 를 설정으로 사용하고 계신데요.

여기에 있는 EntityManager em에 @PersistenceContext 애노테이션을 붙여주시기 바랍니다. 

의존성을 이 설정파일에서 주입하고 있었네요. 

@PersistenceContext
private EntityManager em;

혹시 해보고 안되시면 다시 댓글 부탁드립니다.

감사합니다.

1

백치둥님의 프로필 이미지
백치둥
질문자

안녕하세요! 말씀하신대로 했는데도 여전히 널포인트가 뜹니다.. 코드 업데이트 해서 깃허브에 다시 올렸어요!

https://github.com/keg9999/hello-spring.git

1

백치둥님의 프로필 이미지
백치둥
질문자

https://github.com/keg9999/hello-spring.git

확인부탁드립니다~! 

EntityManager 선언 위에 @PersistenceContext를 달아라는 말씀이신가요..? 달았더니 could not prepare statement  라고 다시 오류가 뜨네용.. ㅠㅠ

0

안녕하세요 백치둥님!

JpaMemberRepository 의 다음 부분에 @Autowired 를 붙이고 다시 실행해보시기 바랍니다.

그리고 모든 Repository 역할을 하는 클래스에 @Repository 애노테이션을 붙여주시기 바랍니다.

감사합니다.

@Repository
public class JpaMemberRepository implements MemberRepository {

private final EntityManager em;
//jpa는 EntityManager 라는것과 함께 동작함

@Autowired
public JpaMemberRepository(EntityManager em) {
this.em = em;
}

0

안녕하세요. 백치둥 님, 공식 서포터즈 codesweaver 입니다.
.

일단 컴파일 단계에서의 오류가 아닌 NullPointerException인것을 보아선 클래스 필드에 EntityManager는 존재하는 것 같습니다. EntityManager 에 @PersistenceContext 애노테이션이 붙어있는지 확인해 주시기 바랍니다. (혹은 @Autowired 라도 있어야 합니다)

.

애노테이션이 이미 붙어있다면 문제 파악을 위해 소스코드를 더 살펴봐야 할것같습니다. 소스코드를 구글드라이브에 공유해주시거나 깃허브에 올린 후 주소를 남겨주시기 바랍니다.

.
감사합니다.

백치둥님의 프로필 이미지
백치둥

작성한 질문수

질문하기