jpa에서 unknown entity 에러가 발생하는 이유는?(http://www.slipp.net/questions/103)) 질문에 대한 해결책을 찾았다. 그런데 해결책에 대한 질문을 찾아보니 그 동안 아무 생각없이 사용하던 객체를 생성하던 부분이 다른 부분이 있구나라는 생각을 해봤다. 아직 정확히 어떤 차이가 있고 어떤 부분을 주의해서 사용해야하는지 방법을 찾지 못했다. 이 질문을 통해서 정확한 차이를 이해했으면 좋겠다.
질문은 다음 코드와 같이 객체를 생성할 때 두 가지 방식으로 생성하 수 있다.
public class ObjectCreator {
public void create1() {
HelloWorld hw = new HelloWorld();
}
public void create2() {
HelloWorld hw = new HelloWorld() {
};
}
}
create1 메소드는 이미 생성되어 있는 HelloWorld() 클래스를 직접 생성하는 것이고 create2 메소드는 HelloWorld 클래스를 상속하는 새로운 객체를 생성하는 것이다. 그런데 이와 같이 생성해 사용할 경우 둘 사이의 동작은 같으리라 생각했다. 그런데 jpa에서 unknown entity 에러가 발생하는 이유는?(http://www.slipp.net/questions/103)) 질문에서 발생하는 현상을 보면 둘 사이의 동작이 다르다는 것을 알 수 있다. 이 둘 사이에 어떤 차이로 인해 이 같은 에러가 발생할까? 문제를 해결하기는 했지만 아직 정확한 원인을 찾지 못했다.
위 소스 코드에 대한 바이트코드를 javap로 보면 둘 사이가 다르게 동작하는 것을 알 수 있다.
Compiled from "ObjectCreator.java"
public class ObjectCreator {
public ObjectCreator();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public void create1();
Code:
0: new #2 // class HelloWorld
3: dup
4: invokespecial #3 // Method HelloWorld."<init>":()V
7: astore_1
8: return
public void create2();
Code:
0: new #4 // class ObjectCreator$1
3: dup
4: aload_0
5: invokespecial #5 // Method ObjectCreator$1."<init>":(LObjectCreator;)V
8: astore_1
9: return
}
0개의 의견 from FB
4개의 의견 from SLiPP
create2에서 생성되는 클래스명으로 추측해 봤을 때 이 같은 에러가 발생한 이유는 HelloWorld 클래스를 생성했지만 HelloWorld 클래스가 아니라 ObjectCreatore의 Inner Class처럼 생성되었기 때문으로 생각된다.
jpa에서 unknown entity 에러가 발생하는 이유는?(http://www.slipp.net/questions/103)에서에서) 발생한 에러도 Question을 생성했는데 Question 객체가 아니라 QuestionBuilder로 인식했기 때문에 jpa Entity로 인식하지 못하는 이슈가 발생한 것이라는 생각이 이 질문을 올리고 생성된 클래스명을 보는 순간 들었다.
http://c2.com/cgi/wiki?AnonymousInnerClass
부분을 확인해 보시면 될 듯 합니다.
의아했던 부분은, 굳이 create2()와 같은 형태로 코딩 할 필요가 있을까요? 제 경험으로는 create2()와 같은 코딩은 Adapter류의 작업이나(위 링크에 나오는) 혹은 http://c2.com/cgi/wiki?DoubleBraceInitialization 와 같은 경우를 제외하고는 없었던 걸로 기억합니다.
해당클래스를 상속받은 이름없는 클래스가 인스턴스가 되었을텐데요.
aop가 적용되기 위하여.
이 이름없는 클래스의 자식 클래스가 cglib으로 만들어지고 이 녀석이 이름없는 클래스를 가지는 관계가 되다보니 꼬여서 문제가 발생할듯 한데요
엉뚱한 답변이면 어떻게하지.
http://www.slipp.net/questions/103 에 답을 달았습니다.
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.