개발조아

Entity, Repository, Service 관련 어노테이션 및 주의점 본문

Spring

Entity, Repository, Service 관련 어노테이션 및 주의점

개발조아 2021. 9. 1. 22:29
728x90

인프런 김영한 님의 Spring 강의를 듣고 정리한 내용입니다.

강의 링크

https://www.inflearn.com/course/스프링-입문-스프링부트

https://www.inflearn.com/course/스프링부트-JPA-활용-1

Entity 관련 어노테이션

  • @Entity 어노테이션으로 도메인 표시
  • 자주 쓰는 엔티티 어노테이션
    • @Id : PK 설정
    • @GeneratedValud : Auto Increment 설정
    • @Column : 객체 변수 이름과 실제 컬럼명과 다를 경우 실제 컬럼명과 매핑 해줌
    • Column(name="컬럼명")
      • name외에 nullable, unique등등 여러 옵션 있음
      • 중복되면 안되는 값의 경우 unique 옵션 권장
        • 동시성 때문에 겹칠수도 있기 때문에 권장
    • @OneToOne, ManyToOne 등등 관계 설정
      • 양방향의 경우 주인 표시 필요
      • ex : OneToMany(mappedBy="객체명")
      • 관계가 있는 반대 테이블의 해당 객체를 주인으로 사용하고 해당 어노테이션이 있는 객체는 읽기전용으로 되어 변경 불가
    • @JoinColumn : 참조하는 테이블의 FK 설정
      • JoinColumn(name="컬럼명")
    • @Inheritance : 상속관계 전략 지정
      • SINGLE_TABLE : 한 테이블로 구성, default
      • TABLE_PER_CLASS : 각 구현체별로 테이블 구성
      • JOINED : 부모 객체의 PKFK로 구성
      • @Inheritance(strategy = InheritanceType.전략)
    • @DiscriminatorColumn
      • 상속 관계 시에 자식 테이블 구분을 위한 필드
      • 부모 테이블에 추가함
      • @DiscriminatorColumn(name="컬럼명")
    • @DiscriminatorValue
      • 자식 테이블의 구분자
      • 부모 테이블의 DiscriminatorColumn 필드에 해당 값이 들어감
      • 해당 어노테이션 사용하지 않으면 클래스 명으로 들어감
      • DiscriminatorValue("구분자")
    • @Enumerated : enum 객체 사용
      • @Enumerated(EnumType.타입)
      • EnumType.STRING : enum 그대로 사용
      • EnumType.ORDINAL : 정의 순서에 따라 값 배정
      • ORDINAL 사용 시 중간에 값이 새로 들어오면 값이 다시 배정되므로 가급적 STRING로 사용하자.

 

Entity 설계 시 주의점

  • Setter는 가급적 사용하지 말자
    • 데이터가 어디서 변경됐는지 찾기가 어려움
  • 모든 연관관계는 지연로딩으로 설정
    • 즉시로딩(EAGER)일 시 연관 매핑되어 있는 테이블 조회 쿼리문도 다 실행이 되어 자원낭비가 된다.
    • 연관관계(fetch = FetchType.타입)
      • EAGER,LAZY
      • ex : ManyToOne(fetch = LAZY)
    • XToOne는 기본 즉시로딩
    • XToMany는 기본 지연로딩
  • 양방향 연관관계인 경우 양쪽 모두 set하는 method 필요
    • 양쪽 테이블에 데이터가 바뀌어야한다.
    • 좀더 역할이 큰 쪽에 method 추가
  •  생성자에 의한 객체 생성보다는 정적 메소드를 통해서만 생성되도록 하는게 유지보수 측면에서 더 좋다
    • 생성자 권한을 protected로 줘서 생성자에 의한 객체 생성을 방지
    • @NoArgsConstructor 데코레이터로도 가능
      • @NoArgsConstructor(access = AccessLevel.PROTECTED)

Repository 관련 어노테이션

  • @Repository 어노테이션으로 스프링 빈에 등록
    • Repository 생성하여 사용시 생성자를 통해 인젝션 하는게 좋으며 이때 객체는 final로 변경할 수 없게 하는게 좋다.
    • @AllArgsConstructor
      • rombok method로 생성자 알아서 만들어줌
    • @RequirArgsConstructor
      • final 붙은 녀석만 생성자 만들어 줌
  • @PersistanceContext
    • EntityManager에 해당 repository 주입
      • Autowired로도 주입 가능
        • Spring Data Jpa가 지원해줌
        • Autowired로 주입 가능하기 때문에 생성자로도 주입이 가능하고 결국 rombok로 대체 가능
          • @RequirArgsConstructor 으로 EntityManager를 주입하는 생성자를 생성하므로써 일관성 있는 코드 관리 가능

EntityManager Method

  • persist
    • 영속 컨텍스트에 저장 
    • 정보 저장
    • persist(객체)
  • merge
    • 정보 업데이트
    • merge(객체)
    • 한번이라도 persist한 객체는 영속 컨텍스트로 남아 있고 merge ID로 영속 컨텍스트에서 찾아서 db에 업데이트하고 객체 복사본을 다시 영속 컨텍스트에 업데이트 한다.
  • find
    • 정보 하나 검색
    • 기본 PK로 검색함
    • find(객체타입, 키명)
    • 전체 조회나 다른 값으로 조회시 쿼리 생성해야함
    • Spring Data Jpa로 쉽게 생성 가능하다
  • createQuery
    • JPQL로 쿼리문 생성 해줌
      • ex 테이블의 전체 내용 조회
        • createQuery(select m from Member m)
        • mMember 클래스 객체
      • ex 이름으로 데이터 조회
        • createQuery(select m from Member m where m.name = :name).setParameter("name",name)
        • 콜론 문자로 표시하여 setParameter로 바인딩해줌

Serivce 관련 어노테이션

  • @Service 어노테이션으로 스프링 빈에 등록
  • @Transactional
    • 자동으로 commit,rollback 등으로 해줌
    • 없다면 데이터 조작 후 반드시 commit rollback 해야 DB에 반영됨
    • readOnly
      • 읽기 전용으로 사용, 좀더 효율적
      • 데이터 읽기의 경우 가급적 옵션값 true로 넣어줌
      • 데이터 수정, 저장인 경우 해당 옵션 없어야 정상 저장

'Spring' 카테고리의 다른 글

Spring boot Redis 사용하기  (0) 2021.12.19
spring entity uuid 사용시 타입 변경  (0) 2021.10.07
Spring URL에서 데이터 가져오기  (0) 2021.10.07
Comments