[JPA] JPA 어노테이션

RuiN·2022년 7월 25일
0

JPA 에서 사용하는 어노테이션..

	@NoArgsConstructor
    @AllArgsConstructor
    @Data
    @Entity
    @Builder
    @RequiredArgsConstructor
    @Table(name = "user", indexes = {@Index(columnList = "name")},uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
    public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NonNull
    private String name;

    @NonNull
    private String email;

    @Enumerated(value = EnumType.STRING)
    private Gender gender;

    @Column(updatable = false)
    private LocalDateTime createdAt;

    @Column(insertable = false)
    private LocalDateTime updatedAt;

    @Transient
    private String testData;

	}

예를 들어 위와 같은 Entity 클래스가 있다고 가정해보자.

@GeneratedValue >> ID값을 별다른 설정을 하지않아도 데이터가 증가됨에따라 인덱스를 자동 1씩 증가시켜준다는 어노테이션
@Transiend >> DB에는 삽입하지 않고 그저 로직에서만 확인하고자 할때 사용하는 어노테이션 (주석)
@Column(insertable = false) >> 쿼리를 확인할때 인서트를 치지 않는것을 확인할 수 있다.

한가지 흥미로운점!! ENUM //

@Enumerated(value = EnumType.STRING)

	public enum Gender {
            MALE,
            FEMALE
     }

위와 같은 Gender 라는 Enum 배열이 있다고 생각해보자.
만약 아무런 설정없이 Entity 클래스에 Gender라는 Enum 을 넣는다면
쿼리 메소드 실행시 다음과같은 결과가 나온다.


      //TEST 메소드//
      @DisplayName("4. ENUM")
      @Test
      void test_4(){
          User user = userRepository.findById(1L).orElseThrow(RuntimeException::new);
          user.setGender(Gender.MALE);

          userRepository.save(user);

          userRepository.findAll().forEach(System.out::println);

          System.out.println(userRepository.findRowRecord().get("gender"));
      }
    
    //TEST 결과 쿼리//
    Hibernate: 
    select
        * 
    from
        user limit 1;
		0

여기서 0이 나온이유는 배열의 의미로 MALE은 Gender라는 Enum에서 0번째에 있기 때문이다.
그렇다면 만약

    @Enumerated(value = EnumType.STRING)
    private Gender gender;

이렇게 Entity에 추가해준다면 결과는

		Hibernate: 
    select
        * 
    from
        user limit 1;
	MALE

위와 같이 MALE이라는 값이 나오게된다.

너무 정리도 제대로 못했지만, 나만을 위한 공부공간으로써 만족합니다..ㅠ

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글