본문 바로가기

DB/JPA

(6)
JPA 양방향 연관관계에서 StackOverflowError 발생한 이유와 해결 Team(팀) 테이블과 Department(부서) 테이블을 양방향 연관관계로 맺고, 이를 조회하거나 디버깅하려고 할 때 다음과 같은 에러가 발생했다.Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate com.example.Team.toString()원인JPA에서 Team ↔ Department 관계를 @OneToMany, @ManyToOne으로 양방향으로 설정하면 다음과 같은 문제가 발생할 수 있다.Team → Department : @ManyToOneDepartment → List : @OneToMany이때 toString()을 호출하면 Team 안의 Department를 출력하고,Department는 다시 Team 리스트를 출..
JPA - DB 테이블 자동 생성과 양방향 연관관계 설정 기본 구조 설명JPA에서는 DB 테이블을 애플리케이션이 실행될 때 자동으로 생성해주는 기능이 있다. 예를 들어, User와 Team 두 엔티티가 있다고 가정하자.User: 사용자Team: 팀관계는 다음과 같다:하나의 팀(Team)에는 여러 명의 유저(User)가 속할 수 있다.한 유저는 하나의 팀에만 속할 수 있다.즉, JPA의 연관관계로 표현하면 다음과 같다:// User.java@ManyToOneprivate Team team;// Team.java@OneToMany(mappedBy = "team")private List users;application.yml 설정자동 테이블 생성을 위해 application.yml에 아래와 같이 설정을 추가한다.spring: jpa: generate-ddl:..
질문할 때 DB 테이블 구조를 깔끔하게 올리는 방법과 JPA 관계 매핑 정리 개발하면서 StackOverflow나 여러 커뮤니티에 질문할 때 DB 테이블 구조를 같이 올려야 하는 경우가 많다. 텍스트로 표를 만들기가 번거로운데, 마크다운 형식 테이블을 쉽게 만들어 주는 웹사이트를 찾아서 소개한다. www.tablesgenerator.com/markdown_tables 이 사이트에선 CSV 파일을 업로드하거나 직접 데이터를 입력해서 마크다운 테이블을 바로 만들 수 있다.덕분에 질문 글을 훨씬 깔끔하게 작성할 수 있어 유용했음! Markdown Tables generator - TablesGenerator.comYou can import table data by uploading file in CSV format (Comma Separated Value). Most spreadsh..
JPA 양방향 매핑 시 발생한 무한 순환 참조 에러 JPA에서 엔티티 간 양방향 연관관계를 설정하던 중, Infinite recursion (StackOverflowError) 에러가 발생했다.nested exception is com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError)문제 상황TestA와 TestB 클래스가 서로 @OneToOne 관계로 얽혀 있고, 양쪽에서 서로를 참조하게 되어 있었다. 이 구조는 직렬화(Jackson을 통한 JSON 변환) 과정에서 무한 루프를 유발한다.문제 코드// TestA.java@OneToOne(targetEntity = TestB.class)@JoinColumn(name = "hm_name")TestB ..
JPA에서 단일 데이터 조회하기 JPA에서 단일 데이터 조회하기JPA로 쿼리를 작성할 때 한 개의 데이터만 불러와야 하는 상황이 있었다.그래서 @Query 어노테이션을 써서 이렇게 작성했는데,@Query("select h from testVo h where h.hmName = :hmName limit 1")하지만 여기서 limit 때문에 에러가 났다. 이유는 Hibernate의 HQL 문법이 SQL의 LIMIT을 지원하지 않아서였다.스택오버플로우를 찾아보니 이렇게 하면 한 개만 가져올 수 있다고 해서 시도해봤다.@Query(value = "select h from testVo h where h.hmName = :hmName")List findAllByhmName(String hmName, Pageable pageable);default..
JPA에서 @Transient 사용하기 JPA를 사용하다 보면 VO 클래스에 DB 컬럼들을 매핑해서 개발하는 경우가 많다.그런데 가끔은 DB 컬럼과 관계없이 임시로 사용하거나 계산용으로만 쓸 변수가 필요할 때가 있다.이럴 때는 @Transient 어노테이션을 붙여주면, JPA가 이 필드를 DB 컬럼으로 인식하지 않고 무시하게 된다.즉, @Transient가 붙은 필드는 데이터베이스에 저장되지도 않고, 조회할 때도 매핑되지 않는다. 주로 계산된 값이나, UI에서만 사용하는 임시 데이터 등을 저장할 때 사용한다.예를 들어, 사용자 이름과 성을 각각 DB 컬럼으로 관리하지만, 전체 이름을 조합해서 보여주고 싶을 때, 전체 이름 필드를 @Transient로 선언하면 편리하다.이렇게 하면 JPA가 해당 필드를 무시하기 때문에, DB 스키마 변경 없이 ..

728x90
반응형