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
- 전역변수
- ES5
- npm
- 문서번호
- 컴포넌튼
- 0.5px border
- 으
- 데이터베이스 #try #이중
- font-size
- jwt
- github
- entity
- 0.75px border
- 1px border
- 10px
- Websocket
- ZOOM
- 0.25px border
- es6
- angular
- Props
- TS
- 클론코딩
- &연산
- Strict
- 서버리스 #
- TypeScript
- literal
- 당근마켓
- 타입스크립트
Archives
- Today
- Total
복잡한뇌구조마냥
[JAVA] JPA 기초 개념 본문
1. JPA란?
- JPA(Java Persistence API): 자바 진영의 ORM(Object Relational Mapping) 표준 인터페이스
- 객체와 테이블 매핑을 도와주는 스펙 (구현체: Hibernate, EclipseLink 등)
- SQL 직접 작성 대신 객체 중심으로 데이터베이스 다룸
👉 즉, “자바 객체를 DB 테이블과 자동으로 매핑해주는 기술”
2. JPA를 쓰는 이유
- SQL 작성 줄임 → CRUD 대부분 자동 처리
- 객체 모델과 테이블 모델의 불일치(패러다임 불일치) 해결
- 유지보수성, 확장성 향상
📌 전통적인 방식
String sql = "INSERT INTO member (id, name) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, member.getId());
pstmt.setString(2, member.getName());
📌 JPA 사용
Member member = new Member();
member.setId(1L);
member.setName("홍길동");
em.persist(member); // SQL 자동 생성
3. JPA 동작 원리
- EntityManagerFactory 생성 (애플리케이션당 하나)
- EntityManager 생성 (DB 연결 단위)
- EntityTransaction으로 트랜잭션 시작/종료
- 엔티티(Entity) → SQL 변환 후 실행
4. 주요 용어
- Entity: DB 테이블과 매핑되는 클래스
- EntityManager: 엔티티를 관리하는 핵심 API
- Persistence Context: 엔티티를 캐싱하고 1차 저장소로 관리하는 영역
- JPQL(Java Persistence Query Language): 엔티티 객체 중심 쿼리
5. Entity 매핑 예제
import jakarta.persistence.*;
@Entity
@Table(name = "members")
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String name;
// Getter/Setter
}
- @Entity → JPA 엔티티임을 선언
- @Id → 기본 키(PK)
- @GeneratedValue → 자동 생성 전략
- @Column → 컬럼 속성 정의
6. CRUD 예제
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
// CREATE
Member m = new Member();
m.setName("홍길동");
em.persist(m);
// READ
Member findM = em.find(Member.class, 1L);
// UPDATE
findM.setName("임꺽정"); // 변경 감지(Dirty Checking)
// DELETE
em.remove(findM);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
- persist() → 저장
- find() → 조회
- remove() → 삭제
- update는 별도 메소드 없음 → 값 변경 시 자동 반영
7. JPQL 간단 예제
SQL이 아닌, 엔티티 객체를 대상으로 한 쿼리 작성
List<Member> result = em.createQuery(
"SELECT m FROM Member m WHERE m.name LIKE :name", Member.class)
.setParameter("name", "%길동%")
.getResultList();
- SQL: SELECT * FROM members WHERE name LIKE '%길동%'
- JPQL: SELECT m FROM Member m WHERE m.name LIKE :name
👉 엔티티(Member)를 대상으로 쿼리
8. JPA의 장단점
✅ 장점
- 생산성: 반복적인 SQL/CRUD 코드 제거
- 유지보수: 객체 중심 개발
- 캐시와 지연 로딩 등 성능 최적화 기능 제공
❌ 단점
- 러닝 커브 있음
- 복잡한 쿼리 최적화는 결국 SQL 튜닝 필요
- DB에 따라 성능 차이 발생 가능
9. 마무리
JPA는 단순 CRUD 이상의 기능(관계 매핑, 캐싱, fetch 전략, JPQL 등)이 강력합니다.
실무에서는 Spring Data JPA와 함께 쓰이며, 그 위에 QueryDSL 등을 얹어 복잡한 쿼리를 처리하기도 합니다.
LIST
'BE > JAVA' 카테고리의 다른 글
[JAVA] Effective Java - ordinal 메서드 대신 인스턴스 필드를 사용하라 (35) (1) | 2025.08.17 |
---|---|
[JAVA] Effective Java - 타입 안전 이종 컨테이너를 고려하라(33) (0) | 2025.08.16 |
[JAVA] 리플렉션(Reflection) 기초 (0) | 2025.08.13 |
[JAVA] Effective Java - 로 타입(raw type)은 사용하지 말라 (26) (2) | 2025.08.11 |
[JAVA] Effective Java - 태그 달린 클래스보다는 클래스 계층구조를 활용하라 (23) (5) | 2025.08.11 |