ORM (Object-Relational Mapping): 데이터베이스 테이블을 자바 객체로 매핑하는 기술
JPA: 자바의 ORM 표준 명세 (구현체: Hibernate)
| 구분 | DTO | Entity |
|---|---|---|
| 역할 | 데이터 저장소 | 기능을 가진 객체 |
| 로직 | 없음 | 비즈니스 로직 포함 |
| JPA 관리 | X | O |
| 기본생성자 | - | 필수 |
// DTO → Entity 변환
public Item toEntity() {
return Item.builder().seq(seq).name(name)...build();
}
// Entity → DTO 변환
public ItemDto toDto() {
return ItemDto.builder().seq(seq).name(name)...build();
}
@Entity
@Table(name = "tblItem")
@Getter
@NoArgsConstructor // JPA 필수
@AllArgsConstructor
@Builder
public class Item {
@Id
@Column(name = "seq")
@SequenceGenerator(name = "seqItem", sequenceName = "seqItem", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqItem")
private Long seq;
@Column(name = "name", nullable = false, length = 100)
private String name;
@Column(nullable = false) // name과 같으면 생략 가능
private Integer price;
// 비즈니스 로직
public void update(String name, Integer price) {
this.name = name;
this.price = price;
}
}
주요 애너테이션:
@Entity: JPA 관리 클래스@Id: Primary Key@Column(nullable=false, length=100): 컬럼 제약조건@GeneratedValue: 자동 증가값public interface ItemRepository extends JpaRepository<Item, Long> {
// JpaRepository가 기본 메서드 제공
// - save(), findById(), findAll(), delete(), count()...
}
Item item = dto.toEntity();
itemRepository.save(item);
Optional<Item> item = itemRepository.findById(1L);
if(item.isPresent()) {
Item result = item.get();
}
// 또는
item.ifPresent(v -> { /* 처리 */ });
Optional<Item> item = itemRepository.findById(seq);
item.get().update("새이름", 5000);
itemRepository.save(item.get()); // 자동 UPDATE
중요: 조회한 Entity는 JPA가 추적. 필드 수정 후 save() 호출 시 UPDATE 자동 실행
Optional<Item> item = itemRepository.findById(seq);
itemRepository.delete(item.get());
Query Method: 메서드명으로 JPQL 자동 생성 단순 조회 (예: ID 검색)
JPQL: 엔티티 객체 대상의 JPA 전용 쿼리 언어 복잡한 조회, JPA 표준 방식
Native Query: DB에 의존적인 SQL 직접 작성 Oracle CONNECT BY 등 DB 전용 기능
(JPA와 결합)
QueryDSL: 자바 코드로 JPQL을 빌드하는 오픈소스 프레임워크 동적 쿼리, 복잡한 JOIN