728x90
반응형
엔티티 매핑 관련 어노테이션
| 어노테이션 | 설명 |
| @Entity | 클래스를 엔티티로 선언 |
| @Table | 엔티티와 매핑할 테이블 지정 |
| @Id | 테이블의 기본키에 사용할 속성을 지정 |
| @GeneratedValue | 키 값을 생성하는 전략 명시 |
| @Column | 필드와 컬럼 매핑 |
| @Lob | BLOB, CLOB 타입 매핑 |
| @CreationTmestamp | insert 시 시간 자동 저장 |
| @UpdateTimestamp | update 시 시간 자동 저장 |
| @Enumerated | enum 타입 매핑 |
| @Transient | 해당 필드 데이터베이스 매핑 무시 |
| @CreateDate | 엔티티가 생성되어 저장될 때 시간 자동 저장 |
| @LastModifiedDate | 조회한 엔티티의 값을 변경할 때 시간 자동 저장 |
| @Temporal | 날짜 타입 매핑 |
CLOB, BLOB의 의미
CLOB : 사이즈가 큰 데이터를 외부 파일로 저장하기 위한 테이터 타입(문자형 대용량 파일을 저장)
BLOB : 바이너리 데이터를 DB 외부에 저장하기 위한 타입(이미지, 사운드, 비디오 같은 멀티미디어 다룰 때)
@Entity
//Item 클래스를 엔티티로 선언
@Table(name="item")
//어떤 테이블과 매핑될지 저장
@Getter @Setter
@ToString
public class Item {
@Id
//엔티티로 선언한 클래스는 반드시 기본키를 가져야 함
@Column(name="item_id")
@GeneratedValue(strategy=GenerationType.AUTO)//기본키 생성 전략 AUTO
private Long id;
@Column(nullable=false, length=50)
private String itemNm;
@Column(name="price", nullable=false)
private int price;
@Column(nullable=false)
private int stockNumber;
@Lob
@Column(nullabe=false)
private String itemDetail;
@Enumerated(EnumType.STRING)
private ItemSellStatus itemSellStatus;
private LocalDateTime regTime;
@Column 속성
| 속성 | 설명 | 기본값 |
| name | 필드와 매핑할 컬럼의 이름 설정 | 객체의 필드 이름 |
| unique(DDL) | 유니크 제약 조건 설정 | |
| insertable | insert 가능 여부 | true |
| updatable | update 가능 여부 | true |
| length | String 타입의 문자 길이 제약조건 설정 | 255 |
| nullable(DDL) | null 값의 허용 여부 설정, false 설정 시 DDL 생성 시에 not null 제약 조건 추가 | |
| columnDefinition | 데이터베이스 컬럼 정보 직접 기술 | |
| precision, scale(DDL) | BigDecimal 타입에서 사용 precision 은 소수점을 포함한 전체 자리수, scale은 소수점 자리수, Double 과 float 타입에는 적용 안됌. |
@GeneratedValue 통한 기본키 생성
| 생성 전략 | 설명 |
| GenerationType.AUTO (default) | JPA 구현체가 자동으로 생성 |
| GenerationType.IDENTITY | 기본키 생성을 데이터베이스에 위임 |
| GenerationType.SEQUENCE | 데이터베이스 시퀀스 오브젝트를 이용한 기본키 생성 @SquenceGenerator를 사용하여 시퀀스 등록 필요 |
| GenerationType.TABLE | 키 생성용 테이블 사용. @TableGeneratror 필요 |
Repository 설계
Spring Data JPA 에서는 엔티티 매니저를 직접 이용해 코드를 작성하지 않아도 됌.
대신 Data Access Object의 역할을 하는 Repository 인터페이스를 설계한 후 사용.
public interface ItemRepository extends JpaRepository<Item, Long> {}
//JpaRepository 는 2개의 제네릭 타입을 사용하는데 첫 번째에는 엔티티 타입, 두 번째는 기본키 타입을 넣어줌.
| 메소드 | 기능 |
| <S extends T> save(S entity) | 엔티티 저장 및 수정 |
| void delete(T entity) | 엔티티 삭제 |
| count() | 엔티티 총 개수 반환 |
| Iterable<T> findAll() | 모든 엔티티 조회 |
개발을 하다 보면 기획 요건이 변경돼 코드를 수정하거나, 기존의 소스코드를 수정해야 하는 상황이 많음.
따라서 의미 있는 테스트 케이스를 작성하고 테스트 로직을 작성해야 함.
테스트 환경의 경우 h2 데이터베이스를 사용하도록 application-test.properties 사용.
h2 데이터베이스 : 메모리에 데이터를 저장하는 인메모리 데이터베이스 기능을 제공
@SpringBootTest
//통합 테스트를 위해 스프링 부트에서 제공하는 어노테이션
//실제 애플리케이션을 구동할 때처럼 모든 Bean을 IoC 컨테이너에 등록(규모가 크면 느려질 수 있음)
@TestPropertySource(locations="classpath:application-test.properties")
//우선순위 부여
class ItemRepositoryTest {
@Autowird
ItemRepository itemRepository;
//Bean주입
@Test
@DisplayName("Test")
//Junit5에 추가된 어노테이션으로 테스트 코드 실행 시 테스트명 노출
public void createItemTest() {
Item item = new Item();
item.setItemNm("Test P")
item.setPrice(10000);
item.setItemDetail("Detail")
......
Item savedItem = itemRepository.save(item);
}
}
Spring Data JPA는 인터페이스만 작성하면 런타임 시점에 자바의 Dynamic Proxy를 이용해서 객체를 동적으로 생성해 줌.
728x90
반응형
'Spring boot' 카테고리의 다른 글
| Thymeleaf(타임리프) (0) | 2023.09.04 |
|---|---|
| Spring DATA JPA (2) | 2023.09.02 |
| 쿼리 메소드 (0) | 2023.09.02 |
| JPA(Java Persistence API) (0) | 2023.08.31 |
| Spring boot (0) | 2023.08.28 |