728x90

JPA 12

JPQL createQuery 메서드 탐구

EntityManager 에는 두 가지 createQuery 메서드가 있습니다. 시그니처 반환 타입 특징 Query createQuery(String jpql)Query (raw)타입 정보를 잃어버림. 컴파일 단계에서 결과 타입을 체크할 수 없고, 캐스팅이 필요합니다. TypedQuery createQuery(String jpql, Class resultClass)TypedQuery제네릭 기반 타입-세이프(type-safe) 쿼리. 컴파일러가 결과 타입을 T로 고정해 주므로 캐스팅이 필요 없고 오류를 미리 잡아줍니다.각각 비교// 1) 타입-세이프 쿼리TypedQuery query = em.createQuery("select m from Member m where m.name = :name",..

JPA 2025.06.05

JPQL 문법 완벽 가이드: JPA를 위한 쿼리 작성법

Java Persistence API(JPA)를 사용할 때 객체 지향 패러다임을 유지하면서 데이터베이스를 조회하기 위해서는 Java Persistence Query Language(JPQL) 를 이해해야 합니다. JPQL은 SQL과 유사하지만, 테이블이 아닌 엔티티와 그 관계를 대상으로 질의를 수행한다는 점이 특징입니다. 본 글에서는 JPQL의 핵심 문법과 실전 예제, 그리고 성능 최적화 팁까지 한 번에 정리해 보겠습니다.1. JPQL 기본 구조JPQL의 구문은 SQL과 유사하나, 주요 키워드와 대상이 엔티티임을 기억하세요.// JPQL 기본 예시String jpql = "SELECT m FROM Member m WHERE m.age > 20"; 절 설명SELECT반환할 엔티티(또는 필드) 지정FROM조..

JPA 2025.06.05

Java null pointer 시대와 작별하는 가장 우아한 방법

1. 왜 Optional인가?NullPointerException(NPE)은 자바 역사상 가장 흔한 런타임 오류입니다. Optional는 “값이 있을 수도, 없을 수도 있다”는 사실을 타입 시스템에 명시함으로써, 호출자에게 반드시 선택을 강제합니다. 컴파일 타임에 “값이 없을 수도 있다”는 사실을 알릴 수 있고API 설계 의도를 더 읽기 쉽게 만들며방어적 코드(불필요한 null 체크)를 줄여 가독성과 안정성을 높여 줍니다.2. Optional 기본 사용법 빠르게 훑어보기Optional maybeMember = memberRepository.findById(1L);// 값이 있으면 그대로, 없으면 기본값Member m1 = maybeMember.orElse(defaultMember);// 필요할 때 지연 ..

JPA 2025.06.05

JPA에서 @Enumerated 사용할 때 주의사항 정리

JPA를 사용하면서 enum 타입을 매핑할 때 자주 사용되는 애노테이션이 @Enumerated입니다. 하지만 잘못 사용하면 치명적인 데이터 오류로 이어질 수 있으므로 주의가 필요합니다. 이 글에서는 @Enumerated의 사용법과 왜 EnumType.ORDINAL을 피해야 하는지 자세히 정리합니다. @Enumerated란?Java의 enum 타입을 JPA 엔티티 필드와 DB 컬럼 간에 어떻게 매핑할지 지정하는 애노테이션입니다.@Enumerated(EnumType.STRING)private Status status;@Enumerated는 기본적으로 EnumType.ORDINAL 방식으로 동작합니다. 타입설명EnumType.ORDINALenum의 순서(index) 를 DB에 저장 (예: 0, 1, 2)Enu..

JPA 2025.05.01

JPA 연관관계 정리 (단방향, 양방향 관계 포함)

JPA(Java Persistence API)에서는 엔티티 간의 관계를 정의할 때 단방향과 양방향 관계를 설정할 수 있습니다. 이 관계들은 Many-to-One, One-to-Many, One-to-One, Many-to-Many 등 다양한 매핑 관계와 함께 설정할 수 있으며, 각 방향에 따라 데이터 흐름과 관계 관리 방식이 달라집니다.이번에는 단방향과 양방향 관계를 포함한 JPA 관계 설정을 정리해 보겠습니다.1. 단방향 관계 (One-Way Relationship)단방향 관계는 한 엔티티에서만 다른 엔티티를 참조하는 관계입니다. 즉, 한 쪽에서만 연관된 엔티티를 관리하고, 다른 쪽에서는 해당 관계를 알지 못하는 형태입니다. 이 경우, 양쪽 엔티티에서 연관된 객체를 조회하거나 수정할 수 없습니다.예시:..

JPA 2025.04.29

양방향 매핑에서 연관관계의 주인에 값을 입력하지 않은 실수

JPA(Java Persistence API)를 사용하면서, 특히 양방향 연관관계를 매핑할 때 자주 발생하는 실수 중 하나는 연관관계의 주인에 값을 제대로 설정하지 않는 것입니다. 이 실수는 데이터베이스에 저장되는 결과가 의도한 대로 동작하지 않거나, 예상치 못한 오류가 발생하는 원인이 됩니다.1. 양방향 연관관계란?JPA에서 양방향 연관관계는 두 개의 엔티티 간에 서로를 참조하는 구조를 말합니다. 예를 들어, Member와 Team 엔티티가 있을 때, Member는 Team을 참조하고, Team은 여러 Member들을 참조하는 관계가 있을 수 있습니다.예시: Member와 Team의 양방향 관계@Entitypublic class Member { @Id @GeneratedValue pri..

JPA 2025.04.29

데이터 중심 설계와 객체 중심 설계의 차이 – JPA 예제로 쉽게 이해하기

안녕하세요! 오늘은 데이터 중심으로 모델링한 예제가 왜 협력 관계를 만들 수 없는지 쉽게 설명해볼게요.우선 아래 코드를 보면서 어떤 부분이 문제가 되는지 살펴봅시다.Team team = new Team();team.setName("TeamA");em.persist(team);Member member = new Member();member.setUsername("memberA");member.setTeamId(team.getId());em.persist(member);Member findMember = em.find(Member.class, member.getId());Long findTeamId = findMember.getTeamId();Team findTeam = em.find(Team.class,..

JPA 2025.04.28

JPA에서 플러시(Flush)와 커밋(Commit)의 차이 + 트랜잭션 관리 완벽 정리

JPA를 공부하다 보면 자주 마주치는 개념 중 하나가 바로 플러시(Flush)와 커밋(Commit)입니다. 이 둘은 비슷해 보이지만 실제로는 역할과 시점이 다릅니다. 또한, 트랜잭션의 관리 방식도 함께 이해해야 JPA를 제대로 활용할 수 있습니다.이 글에서는 플러시와 커밋의 차이, 그리고 트랜잭션의 흐름까지 쉽게 정리해보겠습니다.1. 플러시(Flush)란?정의: JPA의 영속성 컨텍스트(1차 캐시)에 저장된 변경 내용을 DB에 SQL로 반영하는 작업입니다.중요: 플러시는 트랜잭션을 끝내지 않습니다. 단순히 SQL이 실행될 뿐이고, 트랜잭션은 계속 유지됩니다.언제 플러시가 일어날까?직접 호출: em.flush()JPQL 실행 전: 정확한 결과를 위해 자동 플러시커밋 직전: 자동으로 플러시 후 커밋 진행2...

JPA 2025.04.27

JPA 기본키 매핑 전략 완벽 정리

JPA(Java Persistence API)를 사용할 때 가장 먼저 고민하게 되는 부분 중 하나가 바로 기본키(Primary Key) 매핑 전략입니다. 엔티티(Entity)는 데이터베이스 테이블과 매핑되기 때문에, 각 엔티티에는 반드시 고유한 식별자(Primary Key)가 필요합니다.이번 포스팅에서는 JPA에서 제공하는 기본키 매핑 전략에 대해 하나씩 자세히 알아보겠습니다.1. 기본키 매핑 방식의 종류JPA에서는 기본키를 매핑할 때 총 4가지 전략을 제공합니다.직접 할당 (Assigned, 직접 설정)자동 증가 (IDENTITY)시퀀스 (SEQUENCE)테이블 (TABLE)2. 직접 할당 (Assigned)@Idprivate String id;개발자가 직접 기본키 값을 지정합니다.자동 생성되지 않기 ..

JPA 2025.04.26

JPA 영속성과 캐시의 관계 – 캐시처럼 동작하는 영속성 컨텍스트

JPA = ORM + 캐시?JPA를 쓰다 보면 마치 자동으로 캐시를 써주는 것 같은 경험을 하게 됩니다. 같은 데이터를 여러 번 조회해도 SQL 쿼리가 한 번만 날아가고, 트랜잭션 내에서 바뀐 값이 자동으로 DB에 반영되기도 하죠. 이 모든 비밀은 영속성 컨텍스트에 있습니다.1. 영속성 컨텍스트는 1차 캐시다JPA에서 영속성 컨텍스트는 1차 캐시 역할을 합니다.1차 캐시란?트랜잭션 범위 내에서만 유효한 메모리 캐시입니다.동일한 EntityManager에서 같은 엔티티를 여러 번 조회해도 DB에서 재조회하지 않고 캐시에서 반환합니다.2. persist()와 캐시의 관계📍 persist() 호출 시엔티티는 영속성 컨텍스트에 저장됩니다.이후 해당 엔티티는 1차 캐시에 존재합니다.같은 엔티티를 다시 조회하면 ..

JPA 2025.04.24
728x90