이번 프로젝트에서도 Member와 Security를 맡았다. 하지만 전혀 똑같지 않다..ㅎㅎ
Member CRUD 를 작성하고 RUN을 돌리는 순간 에러가 발생했다.
에러 메세지에서는 controller, service, repository Bean 생성을 하지 못 하는 상태라고 알려주고 있었고 마지막에 "Not a managed type : 클래스 위치" 를 띄워주고 있었다.
이를 따라 Member 클래스를 확인해보니 @Entity 어노테이션을 붙이지 않은 채로 있었던 것이다.
이유는 에러에 나와있었기에 금방 찾아서 어노테이션을 붙여 에러를 없앨 수 있었다.
하지만, 문제는 내가 Entity와 테이블 매핑에 대한 이해가 그동안 부족했다는 것을 알게 되었다.
@Entity는 테이블과의 매핑이라고 생각했고 이걸 곧 테이블 간의 연관관계 설정이라고 생각하고 있었던 것이다... 그래서 연관관계를 설정할 때 붙여주면 될 것이라 생각하였다.
그래서 Entity에 대해 더욱 자세히 알아보고 JPA에서 Entity의 역할에 대해 알아보기로 하였다.
🟢 @Entity
JPA에서의 entity 어노테이션에 대해 알아보기 전 엔티티란 무엇인가? 에 대해 먼저 다시 살펴보는 것이 좋을 듯 하여 entity에 대해 이해하고자 하였다.
다시 SQLD 자격증을 준비하며 보았던 내용들이 떠올랐다.
@Entity 어노테이션은 "객체와 테이블"간의 매핑에서 사용된다.
JPA에서는 @Entity 어노테이션을 붙여 줌으로써 어노테이션이 붙은 해당 클래스가 엔티티로 사용되며 DB의 테이블과 매핑됨을 나타낼 수 있다. 만약 @Entity를 붙여주지 않는다면 JPA가 엔티티를 관리하지 못하게 되고 위와 같은 에러가 발생하게 되는 것이다.
🟢 @Entity 속성
속성 | 기능 | 기본값 |
name | - JPA 에서 사용할 엔티티 이름 지정 - 보통은 기본값인 클래스 이름 사용 ✨ 만약 다른 패키지에 같은 이름의 엔티티 클래스가 있으면 이름을 지정해주어야 한다. ex) USER -> (name = "USERS") |
- 기본값은 name을 따로 지정해주지 않으면 해당 클래스의 이름이 그대로 엔티티명이 된다. |
🟢 @Entity 적용 시 주의사항
- 기본 생성자는 필수 ➡️ JPA가 엔티티 객체 생성 시 기본 생성자를 사용하기 때문
- final 클래스, enum, interface, inner 클래스에는 사용 불가
- 저장할 필드에 final 사용 불가 ➡️ final 키워드를 사용하게 되면 필드 값을 변경하지 못한다. 하지만 JPA는 엔티티 객체를 생성하고 DB와 매핑을 관리하는 과정에서 필드 값을 변경할 수 있어야 하기 때문에 final을 붙여 선언하게 되면 JPA 작업이 이루어지지 않는다.
💬 느낀 점
@Entity 어노테이션에 대해 공부하면서 테이블 매핑과 연관 관계 매핑에 대해서도 다시 살펴보는 시간을 가졌다. JPA에 대해 제대로 알지 못하는 것 같다는 생각에 이번 프로젝트에서는 어노테이션 하나하나 꼼꼼히 살펴보고 공부해야겠다는 생각이 들었다.
그리고 사실 getter와 setter 등 언제 어떤 메서드를 사용해야하는지에 대한 이해 또한 부족했는데 오늘 공부하며 언제 왜 get 메서드를 사용하고 언제 set 메서드를 사용하는지도 감이 잡히게 되었다.
* getter는 값을 가지고 와야 하는 경우, setter는 값이 변경되어 set 해주는 경우 사용