티스토리 뷰

728x90

JPA로 개발 하던 중 기초가 부족해서 정리해본 글입니다.

 

@Entity란?


- @Entity가 붙은 클래스는 JPA가 관리하는 것을 뜻함

- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수 선언\

 

엔티티.java의 일부

@Entity
@Getter
@Setter
@Table(name="tb_club")
public class Club {
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "club_id", columnDefinition = "INT(11) UNSIGNED")
	private Long id;
	
	@Column(name = "name", length = 50)
	private String name;
	
	@Column(name = "intro", length = 500)
	private String intro;
	
	@Column(name = "applied_at")
	private LocalDateTime appliedAt;
	
	@Column(name = "approved_at")
	private LocalDateTime approvedAt;
	

    
    }

 

@Entity 사용시 주의사항

Q. 기본 생성자 필수로 선언되어야 한다.(public, private)

A. 내부적으로 Class.newInstance()라는 리플렉션을 이용해 해당 Entity의 기본 생성자를 호출해서 객체를 생성하게 되는데, 이 리플렉션은 생성자의 매개변수를 읽을 수가 없어서 반드시 기본 생성자를 정의해 줘야 한다.
항상 기본 생성자를 명시적으로 정의해야 하는 것은 아니고 만약 아래 예시처럼 인자가 있는 생성자를 정의했을 때만 기본 생성자를 생성해주면 된다.

 

....
public User(String name) {
this.name = name;
}
....



만약 인자가 있는 생성자를 정의하지 않았다면 자바에서 자동으로 기본 생성자를 생성하기 때문에 따로 명시적으로 기본 생성자를 정의하지 않아도 된다.

 

Q. final 클래스 , enum, interface, inner클래스에는 사용이 불가하다

 A. JPA 내부에서 프록시 객체가 엔티티 클래스를 상속받기 위함

 

Q. 저장할 필드에 final 사용이 불가하다.

 A. JPA 구현체들은 엔티티를 내부에서 다양한 방식으로 사용한다.

예를 들어서 엔티티를 JPA 구현체가 생성할 때 리플렉션을 사용해서 객체를 먼저 생성하고, 나중에 값을 필드에 직접 넣어주기도 한다.

이런 경우 final이면 안되며, 지연로딩 등을 위해 프록시 기술을 사용하기도 한다.

이렇게 다양한 방식으로 JPA 구현체들이 사용할 수 있도록 JPA는 스펙상 final을 사용하지 못하도록 막아두었다.

 

리플랙션이란? 


 

리플랙션이란?

구체적인 클래스 타입을 알지 못해도, 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

 

이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading)하여

생성자(Constructor), 멤버 필드(Member Variables) 그리고 멤버 메서드(Member Method) 등을 사용할 수 있도록 한다.

 

 

리플랙션 참고 블로그

https://1-7171771.tistory.com/123

 

 

728x90
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday