Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 트라이
- 2021 KAKAO BLIND RECRUITMENT
- 2020 카카오 인턴십
- 2020 KAKAO BLIND RECRUITMENT
- 파이썬
- 백트래킹
- 백준
- 크루스칼
- 플로이드와샬
- 투 포인터
- 조합
- 다익스트라
- 스택
- 2018 KAKAO BLIND RECRUITMENT
- GIT
- 투포인터
- 이분탐색
- 프로그래머스
- Spring
- 2019 KAKAO BLIND RECRUITMENT
- 우선순위큐
- 최소 신장 트리
- SWEA
- 비트마스킹
- 브루트포스
- 플로이드 와샬
- 구현
- 시뮬레이션
- 로봇 청소기
- BFS
Archives
- Today
- Total
개발조아
Entity, Repository, Service 관련 어노테이션 및 주의점 본문
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 : 부모 객체의 PK를 FK로 구성
- @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를 주입하는 생성자를 생성하므로써 일관성 있는 코드 관리 가능
- Autowired로도 주입 가능
- EntityManager에 해당 repository 주입
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)
- m은 Member 클래스 객체
- ex 이름으로 데이터 조회
- createQuery(select m from Member m where m.name = :name).setParameter("name",name)
- 콜론 문자로 표시하여 setParameter로 바인딩해줌
- ex 테이블의 전체 내용 조회
- JPQL로 쿼리문 생성 해줌
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