1 minute read

값타입: JPA의 데이터 타입 분류

JPA의 데이터 타입 분류

  • 엔티티 타입
    • @Entity로 정의하는 객체
    • 데이터가 변해도 식별자로 지속해서 추적 가능
  • 값 타입
    • int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
    • 식별자가 없고 값만 있으므로 변경시 추적 불가

값 타입 분류

  • 기본값 타입
    • 자바 기본 타입(int,double)
    • 래퍼 클래스 (Integer,Long)
    • String
    • 자바의 값 타입은 공유 해서는 안된다. (기본 값 타입은 공유가 되지 않는다)
      • ex) int,double 과 같은 기본타입은 공유되지않음
      • Integer 래퍼 클래스 String 특수클래스는 공유가능한 객체이지만 변경 X
      int a=10;
      int b=a;
        
      a=20;
        
      System.out.println("a =" + a); //20
      System.out.println("a =" + b); //10
    
  • 임베디드 타입 (embedded type, 복합 값 타입)
    • 새로운 값 타입을 직접 정의할 수 있음
    • JPA는 임베디드 타입 이라 함
    • 주로 기본 값 타입을 모아서 만들어서 복합 값 타입이라고도 함
  • 컬렉션 값 타입 (collection value type)
  • 임베디드 타입(복합 값 타입)
    • 임베디드 = 포함하다
    • @Embeddable :데이터 베이스가 매핑하려는 필드가 포함된 JAVA 클래스를 정의하여 유형을 정의 할 수 있다.
    • @Embedded : 를 사용하여 정의한 유형을 사용할 수 있다.

    ex)

      @Embeddable
      public class Address{
      	private String street;
      	private String city;
      	private String state;
      }
        
      @Entity
      public class Person{
      	@Id 
      	@GeneratedValue
      	private Long id;
        
      	private String name;
        	
      	@Embedded
      	private Address address;
        	
      }
    
    • ㅇ임베디드 객체를 사용함으로서 코드의 간결함과 응집도를 가져갈 수 있다.
  • 값 타입과 불변 객체
    • 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험함
      Address address = new Address("city", "street", "10");
        
      Member member=new Member();
      member.setUsername("member1");
      member.setAddress(address);
      em.persist(member);
        
      Member member2=new Member();
      member2.setUsername("member2");
      member2.setAddress(address);
      em.persist(member2);
        
      member.getAddress().setCity("hi"); //member 객체와 member2 객체의 city값이 동시에 변경됨
    
      Address address = new Address("city", "street", "10");
        
      Member member=new Member();
      member.setUsername("member1");
      member.setAddress(address);
      em.persist(member);
        
      Address copyAdress = new Address(address.getCity(), address.getStreet(), address.getZipcode());
        
      Member member2=new Member();
      member2.setUsername("member2");
      member2.setAddress(copyAdress);
      em.persist(member2);
        
      member.getAddress().setCity("hi");
    
    • 객체 타입은 공유참조를 피할 수 없다. → 객체 자체를 수정하여 변경
      Address address = new Address("city", "street", "10");
        
      Member member=new Member();
      member.setUsername("member1");
      member.setAddress(address);
      em.persist(member);
        
      Address newAddress=new Address("city","street","1000");
      member.setAddress(newAddress);
    

    불변 객체

    • 객체 타입을 수정할 수 없데 만들면 부작용을 원천차단
    • 값 타입은 불변 객체로 설계
    • 불변객체: 생성시점이후 값을 변경할수 없는 객체
  • 값 타입의 비교
    • 인스턴스가 달라도 그 안에 값이 같으면 같은 것으로 봐야함
    • 동일성 비교: == (인스턴스의 참조 값을 비교)
    • 동등성 비교: equals() (인스턴스의 값을 비교)
  • 값 타입 컬렉션

Updated: