Springboot에서의 어노테이션

Jinjin·2023년 9월 3일
0
post-thumbnail

🟥 어노테이션

  • @Entity

    : DB 테이블에 대응하는 하나의 클래스 ⇒ @Entity가 붙은 클래스는 JPA가 관리해준다.

    • 접근 제어자가 public 혹은 protected인 기본 생성자가 필수이다.
    • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
    • 저장하려는 속성은 final이면 안됨
    • 속성
      • name : JPA에서 사용할 엔티티의 이름을 지정한다. ⇒ 보통은 기본값인 클래스 이름을 사용하지만, 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해야 한다. Ex) @Entity(name=”Member”) → 같은 이름이 없으면 가급적 기본값을 사용하는게 좋다.
    • @Entity와 @Table을 단일로 사용하는 경우와 함께 사용하는 경
      1. @Entity만 사용한 경우

        ⇒ DB에 연결하면 테이블명은 클래스명과 동일하게 설정된다.

      2. @Entity와 @Table(name=”테이블명”)으로 설정한 경우

        ⇒ 호출은 엔티티의 클래스이름으로 하지만 실제 DB에는 테이블명의 테이블로 붙게 된다.

  • @NoArgsConstructor1

    : 기본 생성자를 만들어준다.

    • @NoArgsConstructor(force=true) 를 사용하면 null, 0 등 기본 값으로 초기화 된다.
  • @RequiredArgsConstructor

    : final 변수 , Notnull 표시가 된 변수처럼 필수적인 정보를 세팅하는 생성자를 만들어준다.

  • @AllArgsConstructor

    : 전체 변수를 생성하는 생성자를 만들어준다.

  • @Id

    : JPA 엔티티 객체의 식별자로 사용될 필드에 적용함, 유니크한 DB의 컬럼과 매핑한다.

  • @GeneratedValue

    : 기본 키를 자동 생성해주는 어노테이션이다.

    • 속성
      • IDENTITY : 기본 키 생성을 데이터베이스에 위임하는 전략이다. Ex) @GeneratedValue(strategy = GenerationType.**IDENTITY**)
      • SEQUENCE : 유일한 값을 순서대로 생성하는 DB 오브젝트이다. 이 시퀀스를 사용해서 기본 키를 생성한다. Ex) @GeneratedValue(strategy = GenerationType.SEQUENCE)
  • @Column

    : 객체 필드를 테이블의 컬럼에 매핑시켜주는 어노테이션이다.

    • 속성
      • name : 필드와 매핑할 테이블의 컬럼 이름을 지정한다. (기본값: 객체의 필드 이름) Ex) @Column(name = "MEMBER_NAME")
  • @ManyToOne, @OneToMany, @JoinColumn

    • 객체의 단방향, 양방향 매핑

      : 양방향 매핑은 두 객체가 서로 참조해야 하는 상황에서 정의하는 연관관계 방식이다,

      실제로는 각각의 단방향 매핑이 존재하는 것이며 이를 합쳐서 양방향을 의미한다.

    • @ManyToOne

      : 다대일의 관계(현재의 테이블이 N, 참조하려는 테이블이 1이다)

        Ex) TABLE_ACCOUNT 테이블이 N의 관계

      @ManyToOne
      @JoinColumn(name = "user_id") // DB의 user_id 컬럼을 가져옴
      private User user;

      Q. Account 엔티티는 User 엔티티와 연관관계를 맺고 있다는 것을 어떻게 알 수 있는걸까?

      A. referencedColumnName 속성은 생략하면 자동으로 대상 테이블의 PK 값으로 지정되기 때문에 생략해도 알아서 PK 값하고 잘 매핑이 되는 것이다.

    • @OneToMany

      : 일대다의 관계(현재의 테이블이 1, 참조하려는 테이블이 N)

      Ex) TABLE_USER 테이블이 1의 관계

      @OneToMany(mappedBy = "user") // 조회하려는 정보는 Account Entity의 user 정보를 참고할 것이기 때문에 mappedBy를 통해 연관관계를 매핑한다.(생략하면 실행시 중간 테이블 생성됨)
      private List<Account> accounts = new ArrayList<>();
    • @OneToOne
      : 외래키가 있는 테이블이 연관 관계의 주인이다.

    • @JoinColumn

      • 속성
        • name : 테이블의 어떤 컬럼을 가져올 것인지 설정한다.
💡 User 객체에 MappedBy가 적용되어 있다. 이 경우에는User 객체는 테이블을 관리할 수 없고 Account 객체만이 권한을 받고 주인이 아닌 쪽은 읽기(조회) 만 가능하다. 즉, mappeyBy가 정의되지 않은 객체가 주인이 되는 것이다. ⇒ 연관관계의 주인은 외래키가 있는 쪽이다.
  • @Enumerated : Enum 타입으로 설정하기 위한 어노테이션이다.
    • 타입
      1. EnumType.ORDINAL

      2. EnumType.STRING

        ⇒ ORDINAL은 Enum에 정의된 순서대로 JPA가 이용하는데, 만약 순서가 변경된다면 꼬이게 되므로, 무조건적으로 STRING 타입을 이용하자!

  • @Prepersist
    : JPA 엔티티가 비영속 상태에서 영속 상태가 되는 시점 이전에 실행된다.
  • @PreUpdate
    : 영속 상태의 엔티티를 이용하여 데이터 업데이트를 수행하기 이전에 실행된다.
profile
BE Developer

0개의 댓글