- class
- 클래스는 객체를 만들기 위한 설계도입니다.
- 객체지향 프로그래밍(oop)의 핵심 개념으로, 속성(필드) + 동작(메서드) 를 하나로 묶어 표현합니다.
public class Car{
String color;
int speed;
void drive(){
System.out.println("자동차가 달립니다.")
}
}
Car myCar = new Car(); Car라는 클래스 설계도로 myCar라는 객체(instance)를 생성
- class의 장점
- 재사용성
- 한 번 만든 클래스를 여러 객체에서 재사용 가능
- 유지보수 용이
- 코드 구조가 명확하고, 변경 시 영향 범위를 예측하기 쉬움
- 캡슐화
- 데이터 은닉하여 보안성 강화, 코드 안정성 증가
- 상속과 다형성
- 중복 코드를 줄이고, 다양한 방식으로 확장 가능
- 추상화
- 현실 세계 개념을 직관적으로 코드로 표현 가능
- class의 단점
- 복잡성 증가
- 작은 프로그램도 클래스를 남발하면 구조가 복잡해지고 불필요하게 무거워질수 있음
- 메모리 사용량 증가
- 객체를 많이 생성하면 메모리를 많이 차지할 수 있음
- 절차지향보다 성능이 떨어질 수 있음
- 함수 단위로만 빠르게 처리하는 절차지향보다, 객체지향은 구조와 유연성을 고려해야 해서 속도가 느릴수 있음
- 설계가 어려울 수 있음
- 잘못된 클래스 설계는 오히려 유지보수를 어렵게 만들 수 있음
- ORM(Object-Relational Mapping)
- 객체와 DB 테이블을 객체지향적으로 사용하게 해주는 기술 입니다. 원래 RDB 테이블은 객체지향적 특성(상속, 다형성, 레퍼런스)등이 없어서 Java와 같은 객체지향적 언어로 접근하는 것이 쉽지 않습니다.이러한 상황에서 ORM을 사용하면 보다 객체지향적으로 RDB를 사용 가능합니다.
- JPA
-
표준 인터페이스
- Java EE의 표준 스펙으로 정의
- Hibernate, EclipseLink 등 다양한 구현체 존재
- Hibernate
- JPA의 가장 대표적인 구현체 입니다. JPA는 표준 인터페이스고 Hibernate는 그 구현체 중 하나입니다.
- 장점
- JPA 표준이고 확장기능이 가능합니다.
- 전략이 SINGLE_TABLE, JOINED, TABLE_PER_CLASS인 일반 JPA와 다르게 일반JPA전략 + UUID, Enhanced Sequence Generator 이 있습니다.
- RDB 테이블을 객체(class)와 매핑하여, SQL 대신 CRUD수행
- 엔터티→테이블
- 속성 → 컬럼
- 객체 인스턴스 → 테이블의 한 행
- 자동 영속성 관리
- EntityManager가 객체 상태를 추적하여 DB에 자동 반영
- EntityManager가 하는 일
- JPA에서 엔터티 객체를 관리하는 핵심 관리자입니다.
- 객체상태를 추적하고 필요하는 자동으로 DB반영이 가능합니다.
- Transient
- 새로 생성된 객체, DB연결 x
- Managed
- EntityManager가 관리하는 상태. 객체 변경을 감지하고 DB에 반영
- Detached 관리가 끝난 객체. EntityManager와 연결 끊김
- persist(), merge(), remove() 등 메서드로 쉽게 CRUD가능
트랜잭션 관리와 캐시 지원
- JPQL 지원
- 객체 중심 쿼리 언어(JPQL)지원
- SQL보다 객체지향적이며, DB벤더에 독립적
- JPQL
-
JPA의 장점
- 객체 지향적 설게와 편리성
- SQL을 작성할 필요 없음
- 도메인 모델 중심 설계 가능
- 재사용성과 유지 보수 용이
- 벤더 독립적
- 자동 트렌잭션 및 영속성 관리
- 데이터 일관성 유지
- 복잡한 관계 매핑 지원
- 상속 매핑 전략(SINGLE_TABLE, JOINED, TABLE_PER_CLASS) 지원
-
JPA의 단점
-
영속성 컨텍스트, 지연 로딩, JPQL, CASCADE옵션 등 이해가 필요
LAZY(지연로딩)
Cascade(전이, 연쇄 작업)
-
복잡한 쿼리 최적화가 필요할 때 직접 SQL을 작성해야 하는 경우가 있음
-
대규묘 배치 처리에서는 성능이 떨어질 수 있음
-
추가 라이브러리 필요
-
과도한 추상화 가능성
- ORM이 자동으로 처리해 주지만 , 내부 동작을 이해하지 못하면 예상치 못한 동작 발생
MyBatis
레퍼런스는 객체 지향 프로그래밍에서 한 객체가 다른 객체를 참조하는 관계
- JPQL