본문 바로가기

Spring Data

[Spring Data] Entity

Entity.. 엔티티란 한마디로 경량의 영속성 도메인 오브젝트입니다.


여기서 또 영속성이란 메모리영역이 아닌 물리 데이터 저장공간(database)에 저장되어 애플리케이션이 종료되더라도 데이터가 사라지지 않고 남아있음을 의미합니다.


하나의 엔티니는 하나의 테이블이라고 생각하면 이해하기 편할것 같습니다.


1. Entity의 제약조건

엔티티 도메인 클래스를 작성할 때는 몇가지 제약조건이 존재합니다.


1-1. 반드시 클래스에 @Entity 어노테이션이 정의되거나, XML에 작성을 해야합니다.

       @Entity
       public class Player {

위의 코드처럼 클래스에 어노테이션을 작성해줍니다. 스터디에서 XML은 사용하지 않기 때문에 XML에 대한 설명은 생략합니다.


1-2. 반드시 no-arg(파라미터가 없는)생성자를 가지고 있어야합니다.

파라미터가 있는 생성자를 가지고 있어도 되지만, 이 경우 반드시 public혹은 protected의 접근자를 가진 no-arg생성자를 선언해주어야 합니다.


직접 정의한 생성자가 하나도 없다면, 따로 생성자를 작성할 필요는 없습니다.


1-3. 엔티티는 최상위 클래스 이어야합니다.

enum이나 interface타입으로 정의해서는 안됩니다.


1-4. 엔티티 클래스는 final이어서는 안됩니다.

메소드가 없거나 영속성 필드가 없는 경우에는 final으로 선언해도 됩니다만, 이렇게 만들 일이 있을까요...?


2. 영속 가능한 타입

Entity는 기본적으로 아래와 같은 타입을 영속 필드로 가질 수 있습니다.

● 사용자 정의 클래스 : Entity 클래스, MappedSuperClass, Embeddable 클래스

● 자바 데이터 타입 : 기본 자료형, String, 래퍼 클래스, Date, Math타입

● 다중값 타입 : Collection, Array, Map

●기타 : enum, Serializable타입


3 Entity 클래스 예제

아래 코드는 축구선수를 오브젝트로 작성을 해 본 예제입니다.

package com.spring.data.jpa.study.player.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Player {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="player_id")
	private Long id;
	
	@Column(name="name", length=50, nullable=false)
	private String name;
	
	@Column(length=20, nullable=false)
	private String position;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		this.position = position;
	}
	
}

다음 코드는 데이터를 저장공간에 저장하기 위한 Repository코드입니다.

package com.spring.data.jpa.study.player.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.spring.data.jpa.study.player.domain.Player;

public interface PlayerRepository extends JpaRepository {

}

다음은 코드가 동작하는지 확인하기 위한 테스트 코드입니다.



package com.spring.data.jpa.study.player.repository;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.spring.data.jpa.study.SpringDataJapStudyApplication;
import com.spring.data.jpa.study.player.domain.Player;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = SpringDataJapStudyApplication.class)
public class TestPlayerRepository {

	@Autowired
	private PlayerRepository playerRepository;
	
	@Test
	public void testSaveNewPlayer() {
		Player player = new Player();
		player.setName("잠브로타");
		player.setPosition("LB");
		
		playerRepository.save(player);
	}
	
}

신기하게도 database정보를 설정하지 않았는데 테스트가 성공하였습니다. 이유는 모르겠군요.

제 pc에서만 설정없이 동작하는것 일지도 모르므로 db연결 정보를 입력하도록 하겠습니다.

main/resources아래에 있는 application.properties파일을 열어 아래와 같이 입력합니다.


#DataSource

spring.datasource.url=jdbc:h2:tcp://localhost/~/test

spring.datasource.username=sa

spring.datasource.driver-class-name=org.h2.Driver


#Jpa

spring.jpa.database=H2

spring.jpa.show-sql=true

spring.jpa.generate-ddl=true

spring.jpa.hibernate.ddl-auto=create


#logging

logging.level.org.hibernate.type=trace


각 항목에 대한 설명은 다음에 하도록 하겠습니다.