본문 바로가기

전체 글27

JPA::Could not open JPA EntityManager for transaction 오류 Could not open JPA EntityManager for transaction; nested exception is java.util.NoSuchElementException 위 트랜잭션을 만들 수 없다는 오류는 검색을 해보면 DB Connection Pool이 작거나, 접속 정보가 잘못되어 DB 연결에 실패하는 경우 발생할 수 있는데 최근에 이런 경우가 아닌 문제로 오류를 경험하게 되어 기록한다. DB 구성이 쓰기/읽기로 구분되어 있는 환경에서, JPA로 DB 작업을 하고 Annotation으로 쓰기/읽기 DB를 제어한다면 Annotation을 설정의 누락이나 실수로 읽기 DB에 쓰기 작업을 시도하여 같은 오류가 발생할 수 있다. 자신의 소스코드가 읽기 DB에 쓰기 작업을 하고 있지 않은지 확.. 2023. 7. 6.
BlaBlaBla::인텔리J에서 디버깅 모드로 실행되지 않을 때 실행에 문제가 없던 스프링 프로젝트를 디버깅 모드로 실행했을 때 로딩이 완료되지 못하고 멈추는 현상이 간헐적으로 발생한적이 있다. (특정 로그에서 더이상 진행되지 못함) 해결을 위해 프로젝트 재빌드, 의존성 파일 초기화 등을 했지만 해결되지 않았다. 언제는 이건 인텔리J의 프로젝트 환경 설정이 꼬여서 발생하는 문제라고 생각해서 프로젝트 환경설정을 다시했고 이때는 해결된 기억이 난다. 최근에 문제를 찾았는데 인텔리J 프로젝트의 브레이크포인트의 영향으로 디버그 모드에서 멈추는 것이었다. 디버그 모드 실행 전에 브레이크포인트를 모두 제거 후 실행하면 정상적으로 실행된다.(Windows는 ctrl + shift + F8) 2023. 6. 13.
JPA::@Transactional(readOnly = true) Spring Framework에서 JPA 사용 시 @Transactional(readOnly = true) 애노테이션을 사용하면 트랜잭션을 읽기 전용 모드로 동작시킬 수 있고, 성능 향상을 볼 수 있다. JPA는 기본적으로 엔터티를 영속성 컨텍스트에 관리하게 되고, 영속성 컨텍스트는 변경 감지를 위해 스냅샷 인스턴스를 보관하여 메모리를 사용하게 된다. 엔터티를 조회만 하는 경우 변경 감지와 메모리 사용은 불필요하므로 @Transactional(readOnly = true) 애노테이션을 사용하면 트랜잭션이 읽기 전용 모드로 설정되어 변경 감지할 엔터티를 줄이고 메모리 사용을 줄일 수 있다. @Transactional(readOnly = true) 애노테이션을 사용하면 Spring Data JPA는 Hibe.. 2023. 4. 12.
자료형(스칼라 데이터 타입, 컴포지트 데이터 타입) 자료형은 크게 아래 두 가지로 구분된다. 스칼라 데이터 타입(Scalar Types) : 하나의 값만을 저장할 수 있는 자료형 컴포지트 데이터 타입(Composite Types) : 두 개 이상의 복합적인 값을 저장할 수 있는 자료형 2023. 3. 9.
JPA::개념 JPA는 무엇인가? JPA는 Java Persistence API의 약자이며, JAVA 애플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 되는지를 정의한 인터페이스이다. 라이브러리가 아니다. 인터페이스이므로 구현이 없다. 개발자가 직접 SQL을 작성하지 않아도 된다. 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체에 자동으로 Mapping 해준다. 내부적으로 JDBC(Java Database Connectivity) API를 활용한다. SQL을 JPA가 자동으로 해결해 준다는 점에서 생성성을 높여준다. ORM은 무엇인가? ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스의 데이터를 자동으로 Mapping(연결)해주는 것을 말한다. 영속성이란 무엇인가? 데.. 2023. 2. 19.
JPA::JPA, Hibernate, 그리고 Spring Data JPA JPA는 기술 명세이며, 인터페이스이다. JPA는 Java Persistence API의 약자이며, JAVA 애플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 되는지를 정의한 인터페이스이다. 라이브러리가 아니다. 인터페이스이므로 구현이 없다. JPA를 구현한 여러 라이브러리가 존재한다. Spring으로 개발하다 보면 Hibernate 자주 볼 수 있는데, Hibernate는 JPA를 구현한 라이브러리이다. Hibernate 외 DataNucleus, EclipseLink 등 다른 여러 라이브러리가 존재한다.(꼭 Hibernate를 사용해야되는 것은 아니다.) Spring Data JPA는 개발자가 쉽게 JPA를 사용할 수 있도록 한 Spring에서 제공하는 모듈이다. Spring으로 개발하다 보면 J.. 2023. 2. 19.
소프트웨어의 본질 소프트웨어의 본질은 해당 소프트웨어가 사용자를 위해 도메인에 관련된 문제를 해결하는 능력에 있다. 아무리 기술적으로 정교하고 뛰어난 성능을 갖추더라도 당면한 문제를 해결하지 못한다면 해당 소프트웨어는 실패한 소프트웨어라고 할 수 있습니다. 얼마나 빠른가, 얼마나 많이 처리할 수 있나, 얼마나 많은 사람이 붙어서 사용할 수 있나 등은 다음 이야기다. 2023. 2. 19.
Spring::JPA 사용 시 일부 컬럼값만 가져오기 JPA를 사용 시 보통 Entity 클래스에 포함된 모든 데이터를 읽어오게 되는데, 일부 컬럼만 가져오고 싶을 때가 있다. 일부 컬럼만 가져오는 방법을 정리한다. 아래 정의한 Entity 클래스에서 @Entity @Table(name = "deal") public class Deal { @Id @GeneratedValue private Long id; private String name; private Integer price; @OnoToOne(mappedBy = "deal", cascade = CascadeType.ALL) private DealExtra dealExtra; } 일부 컬럼만 가져오기 위한 Interface를 아래와 같이 정의한다. public interface DealMapping {.. 2023. 2. 14.
JS::팝업 윈도우의 닫힘 이벤트 처리 팝업 윈도우로 노출할 페이지가 Origin이 같다면, onbeforeunload로 이벤트 처리하고 const popupWindow = window.open('http://www.google.com') popupWindow.onbeforeunload = function() { // TODO: Your code } Origin이 다르면, onbeforeunload로 이벤트가 발생하지 않기 때문에 setInterval을 사용하여 팝업 윈도우가 닫혔는지 확인한다. const popupWindow = window.open('http://www.google.com'); const timer = setInterval(function() { if (popupWindow.closed) { clearInterval(tim.. 2023. 2. 9.