작성
·
1.5K
0
답변 6
3
안녕하세요!!! 드디어 해결했는데, 총 두가지 문제가 있었어요. codeweaver님께서 말씀해 주신 것처럼 @PersistanceContext 어노테이션 붙이고
jpa수업 교제에 있는 코드 대조해가면서 찾았는데 Member클래스에 강의에 나와있던 @Colum(name = "username")가 없더라고요? 그래서 없애니까 됐어요!! 저것들이 왜 에러를 일으켰는지 모르겠습니다 ㅜㅠㅠ
아! 추가로
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 라도 있어야 합니다)
.
애노테이션이 이미 붙어있다면 문제 파악을 위해 소스코드를 더 살펴봐야 할것같습니다. 소스코드를 구글드라이브에 공유해주시거나 깃허브에 올린 후 주소를 남겨주시기 바랍니다.
.
감사합니다.
안녕하세요 백치둥님!
문제가 해결되어서 다행입니다.
.
우선, 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에 전달되는것 입니다.
.
감사합니다.