2. 처음 떠오르는 코드는?
insert into ORDER Order order = new Order();
(..,ordererid,sa_zipcode,
sa_address1,..) AddressInfo shippingAddress =
values (?,?,?..); orderRequest.
getShippingAddress();
insert into ORDERED_ITEM order.setShippingAddress(
(..,itemid,quantity,price..) shippingAddress);
values (?,?,?...);
Item item = getItem(itemId);
order.addOrderedItem(
createOrderedItem(price, item));
saveOrder(order);
2
3. 처음 떠오르는 코드는?
select Order order = orderRepository.
orderid, ordererid, findOrder(orderId);
sa_zipcode, sa_address1, .., User orderer = order.getOrderer();
u.name
from ORDER o, USER u, ShippingAddress address =
where o.ordererid = u.userid .. order.getShppingAddress();
select * from ORDERED_ITEM List<OrderedItem> itemList =
where orderid = ? .. order.getOrderedItemList();
PaymentInfo paymentInfo =
order.getPaymentInfo();
3
8. 관계형 DB != 객체 지향
관계형 데이터 객체
연관 FK를 통한 단순 연관 양방향 연관.
List, Map 등 풍부한 연관 표현
상속 지원하지 않음 상속/구현을 통한 다형성 제공
세밀함 Value 타입 졲재하지 않음 Value 타입 통한 세밀한 설계
[DBMS에 특화]
8
10. ORM과 매퍼 솔루션들
Hibernate
iBATIS JPA
JDO
Torque
단순 매퍼 객체 지향 지원
10
11. 하이버네이트인 이유
• 쉬운 사용 방법
– 설정 파일을 통한 매핑 관리
• 객체 지향의 다양한 특징 지원
– 다양한 연관 매핑 지원 (1-1, 1-n, n-1, n-m)
– 상속 지원
• 다양한 테이블 구조에 대한 매핑 지원
• 객체 기반 쿼리 지원: HQL, Criteria
• 성능 향상 기법 제공
– 2차 캐시, Lazy Loading 등
11
12. ORM 도구가 필요한 이유
객체지향모델링
코드품질향상
생산성 증가
단순 코드 반복 제거
자체개발 어려움
pstmt.setString(1,bean.getX());
pstmt.setString(2,bean.getY());
pstmt.setSTring(3,bean.getZ());
12
16. 클래스 작성법
final class가 아님
public class Order implements Serializable {
private Integer id; PK와 매핑되는
프로퍼티 제공
private Date registerDate;
public Order() {
기본 생성자 제공
}
public Date getRegisterDate() { … }
getter/setter 제공
public void setRegisterDate() { … }
public boolean equals(Object o) { … }
public int hashcode() { … }
}
16
17. 하입네이트 설정 파일 작성
<hibernate-configuration>
<session-factory>
<property name=“connection.driver_class”>..</property>
<property name=“connection.url”>jdbc:mysql:…</property> DB 연결
<property name=“hibernate.c3p0.min_size”>5</property> 설정
…
<mapping resource=“Order.hbm.xml” /> 매핑 설정
<mapping resource=“Item.hbm.xml” /> 파일 지정
</session-factory>
</hibernate-configuration>
17
19. 기본 CRUD API: save()
Order order = new Order();
order.addOrderedItem(..);
order.setShppingAddress(shppingAddress);
order.setOrderer(orderedUser);
session.save(order);
19
20. 기본 CRUD API: get()
Integer id = …;
Order order = (Order)session.get(Order.class, id);
order.getOrderedItemList();
User orderer = order.getOrderer();
20
21. 기본 CRUD API: update()
Order order = (Order)session.get(…)
order.setShppingAddress(newAddress);
session.update(order);
21
22. 기본 CRUD API: delete()
Order order = (Order)session.get(…)
session.delete(order);
22
23. 쿼리 API
• 객체 기반 조회 기법 제공
– HQL : SQL과 비슷한 쿼리를 이용한 조회
Query query = session.createQuery(“from Order where id = :id”);
query.setInteger(“id”, id);
List orderList = query.list();
– Criteria : API를 이용한 조회
Criteria crit = session.createCriteria(Order.class);
crit.add(Restrictions.eq(“id”, id));
List orderList = crit.list();
23
24. 영속성 처리의 투명함
(Transparent Persistence)
tx = session.beginTransaction();
Order order =
(Order)session.get(Order.class, id);
order.setState(OrderState.CANCEL);
tx.commit();
24