EntityManager로 동적쿼리 우회작성

Yeeun·2025년 4월 24일
0

SpringBoot

목록 보기
20/46


엔티티 매니저가 계속쓰이네 ? 보통트랜잭션단위로 사용되고 버려야하는데 왜 얜 이렇게쓰여 ?그리고 웨얼절은 뒤에문이 안나오면 오류안나오게 항상참이게되는거구나. 여기의엔티티 매니저는프록시객체,가짜객체. 컴포넌트로만들어져 컨테이너에 올라가있고 주입받아 사용될때마다 가짜객체만 오토와이어됐을뿐 엔티티매니저가 사용되는시점, 엔티티매니저.크리에이트쿼리 이때 이미 커넥션객체가 만들어져있고 그때 엔티티 매니저 실제객체가 주입되는식

jdbc할때 커넥션풀 , 데이터베이스는 연결에 비용이 제일 많이들기에 미리연결해두고 쓰는방식 그게 등장하느것 .그걸 관리해주는애가 커넥션풀객체 .
프로젝트의 메이븐디펜더시즈의 히카리 cp라는애

너무 잘 이해하고 계세요! 말씀하신 내용들 하나하나가 핵심을 짚고 있어요. 제가 조금 더 정리해드릴게요, 이해를 확실하게 도와드릴게요 😊


EntityManager는 왜 계속 쓰이나요?

"보통 트랜잭션 단위로 사용하고 버려야 하는데 왜 자꾸 쓰여요?"

정확한 지적이에요!
근데 Spring Boot + JPA 환경에서는 이게 약간 다르게 동작해요:

🌱 JPA에서 EntityManager는 다음과 같이 관리돼요:

  1. @PersistenceContext로 주입된 EntityManagerSpring이 관리하는 프록시 객체예요.
  2. 이 프록시는 트랜잭션마다 알맞은 실제 EntityManager로 바뀌어요.
  3. 즉, 우리가 직접 생성하거나 종료할 필요가 없고, 스프링이 알아서 생명주기 관리를 해줘요.
  4. 그래서 테스트나 서비스에서 그냥 @PersistenceContext 혹은 @Autowired로 꺼내서 계속 써도 문제가 안 생기는 것처럼 보이는 것이에요.

💡 핵심은?

  • 우리가 쓰는 EntityManager는 진짜가 아님.
  • 트랜잭션 시점에 진짜 객체로 바뀌고, 끝나면 정리됨.
  • → 그래서 JPA는 꼭 트랜잭션(@Transactional) 안에서 사용해야 해요!

where 1=1 다시 정리

"뒤에 조건이 안 나오면 오류 안 나게 항상 참이게 만든다"

맞아요! 예를 들어 다음처럼 조건을 붙일 때:

String jpql = "SELECT b FROM Board b WHERE 1=1";

if (title != null) {
    jpql += " AND b.title LIKE :title";
}
if (writer != null) {
    jpql += " AND b.writer = :writer";
}

이렇게 하면 조건이 하나도 안 붙을 경우에도 "WHERE" 절은 남아 있지만 오류 없이 잘 동작해요.
SQL 문법상 WHERE 뒤에 아무것도 없으면 에러나거든요.


✅ 커넥션 풀과 HikariCP

"데이터베이스는 연결이 비싸니까 미리 연결해두고 재사용하는 커넥션 풀 등장, 그걸 관리하는 애가 HikariCP"

👏👏 완벽한 이해입니다!

🔁 JDBC 기본 방식

  • Connection conn = DriverManager.getConnection(...)
    → 이 방식은 매번 DB 연결을 새로 만듦 → 느리고 비효율적

🏊 커넥션 풀 등장

  • DB 연결을 미리 여러 개 만들어서 풀(pool)에 담아두고
  • 누가 요청할 때 꺼내서 쓰고, 다 쓰면 풀에 다시 반납

🐟 HikariCP

  • Spring Boot에서 기본으로 사용하는 커넥션 풀 라이브러리
  • 빠르고 가벼워서 가장 많이 씀
  • application.properties에 설정 가능
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connection-timeout=30000

📌 요약

개념설명
EntityManager스프링이 관리하는 프록시 객체. 트랜잭션마다 진짜 객체로 바뀜
where 1=1쿼리 조립 시 오류 방지를 위한 항상 참 조건
커넥션 풀DB 연결을 미리 만들어두고 재사용
HikariCP스프링부트 기본 커넥션풀 라이브러리 (빠르고 효율적)

혹시 이 내용 바탕으로 더 궁금한 부분이나, 이어서 배우고 싶은 주제 있으신가요?
예를 들어 QueryDSL 심화, HikariCP 설정, 트랜잭션 동작 원리 등도 같이 이어드릴 수 있어요!

0개의 댓글