[Spring / JPA] Server-Sent-Events(SSE)와 OSIV
·
Framework & Library/Spring
1. 서론 요즘 대부분 Spring Boot JPA를 많이 사용하고 추가로 SseEmiters로 실시간 알림기능 구현을 하려고 하면 대다수 IOException : Broken Pipe, Connection is not available, request timed out after 30004ms 이런 에러가 발생할 것입니다. 원인은 JPA의 영속성 컨텍스트, OSIV가 true로 설정되서 생기는 문제입니다. 이 글에서는 OSIV가 뭔지 정확히 왜 이런 에러가 생기는 건지 알아보고자 합니다. 2. 프록시 객체와 지연로딩 2 - 1. 프록시란? 프록시는 실제 클래스를 상속 받아서 만들어진 가짜 객체라고 할 수 있습니다. 이러한 프록시 객체는 실제 객채의 참조를 보관하는 특징을 가지고 있어 프록시 객체를 통해..
[LOATODO] 코드 리팩토링 SELECT 리팩토링
·
Project/LOATODO
1. 서론연관관계 테이블이 늘어나면서캐릭터 데이터를 호출할 때 SQL문이 여러번 실행된다. 1 - 1. 기존코드@Query(value = "SELECT c FROM Character c WHERE c.member = :member AND c.serverName = :serverName")List findCharacterListServerName(@Param("member") Member member, @Param("serverName") String serverName); JPA로 Member Entity를 불러와서 Controller에서 DTO로 변경할 때필요한 데이터들을 LAZY 형식으로 불러온다. 1 - 2. 기존코드 결과2023-11-24 17:32:29.777 DEBUG 39633 --- [ni..
[LOATODO] JPA 영속성 컨텍스트 더티체킹 VS JPQL로 벌크업데이트
·
Project/LOATODO
1. 서론프로젝트에서 JPA를 사용하여 CRUD 중 Update를 구현할 때,보통 변경감지(Dirty Checking)를 이용합니다.Entity를 조회하여 조회된 Entity 데이터를 변경만 하면 데이터 베이스에 자동으로 반영이 되도록 하는 기능입니다. 1 - 1. 영속성 컨텍스트JPA에서는 Entity Manager를 통해 데이터 베이스 작업을 처리합니다.Entity Manager는 내부적으로 영속성 컨텍스트라는 메모리 영역을 가지며 이 안에 데이터베이스로부터 조회한 Entity 객체들이 저장되어 있습니다. 1 - 2. 영속성 컨텍스트 변경감지(더티 체킹) JPA는 트랜잭션 되는 순간 내부적으로 flush()가 호출됩니다.그때 엔티티와 1차 캐시 내의 스냅샷(최초 상태)을 비교합니다.비교했을 때, 변경..
[Spring / JPA] 일대다 매핑과 빌더 패턴
·
Framework & Library/Spring
📕 JPA의 일대다 매핑 관계 📗 엔티티 설계 다음과 같이 Spiring JPA와 Lombok을 사용한 Member 와 Characters 간 1:N 관계가 있다고 가정을 하자 [Member] @Entity @Getter @Setter @NoArgsConstructor public class Member extends BaseTimeEntity { /** * 회원 목록 테이블 */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private long id; @Column(unique = true) private String username; private String password; @Enumerat..
[Spring / JPA] 엔티티 생성/수정 시각 자동화 Auditing
·
Framework & Library/Spring
엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하는 기능이 대부분 있어야한다. 📕 순수 JPA 사용 📗 등록일, 수정일 [JpaBaseEntity] @MappedSuperclass public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createDate; private LocalDateTime updateDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); createDate = now; updateDate = now; } @PreUpdate public void preUpdate() { updateDate = ..
[Spring / JPA] JPQL을 사용한 코드 리팩토링
·
Framework & Library/Spring
스프링 JPA는 다양한 쿼리 방법을 지원한다. 그 중 JPQL을 쓴 내용을 정리해보았다. 📕 JPQL (Java persistence Query Language) 📗 JPQL 이란? 테이블 대상으로 쿼리하는 것이 아니라 엔티티 객체를 대상으로 쿼리한다. SQL과 비슷한 문법을 가지며, JPQL은 결국 SQL로 변환된다. JPA에서 제공하는 메소드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제에서 JPQL이 탄생된 것이다. 📗 특징 객체를 검색하는 객체지향 쿼리 SQL을 추상화 했기 때문에 특정 벤더에 종속적이지 않음 JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회 📕 프로젝트 중 활용(로스트아크 숙제 체크) 📗 엔티티 구조 [Content] - 일일 숙제와 주간 숙제를 나누기 위해 ..
[Spring / JPA] N+1 문제 해결하기!! fetch join과 @EntityGraph
·
Framework & Library/Spring
스프링 JPA에서 특정 엔티티를 조회할 때, ManytoOne관계(1대다)일 경우 FetchType.LAZY 사용을 권장한다. 하지만 이럴경우, SQL을 호출 할 때 N+1 문제가 발생하게 된다. 📕 fetch join 📗 엔티티 구조와 N+1문제 [Member] @Entity @Data public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") private Team team; } [Team] @Entity @Get..
[Java / Spring / JPA] Native Query와 QLRM 라이브러리
·
Framework & Library/Spring
JPA(Java persistence API)를 사용하여 서비스를 구현하다 보면 JPA에서 제공하는 기능만으로는 조회가 불가능한 경우가 존재한다. 대표적으로 엔티티 객체를 그대로 조회하는 것이 아닌 DTO에 맞춰서 조회하는 경우이다. [ 예시 / 인스타그램 클론코딩 중 구독 정보 조회 커리 ] SELECT u.id, u.username, u.profileImageUrl, if((SELECT 1 FROM subscribe WHERE fromUserId = 1 AND toUserId = u.id),1,0) subscribeState, if((1=u.id),1,0) equalUserState FROM user u INNER JOIN subscribe s ON u.id = s.toUserId WHERE s.fr..
[Java / Spring / JPA] 맵핑 어노테이션 @Entity, @Table, @Column, @Id
·
Framework & Library/Spring
객체 - 테이블 맵핑 : @Entity, @Table 필드 - 컬럼의 팹핑 : @Column 기본키의 맵핑 : @Id 조인 맵핑 : @ManyToOne, @JoinColumn 📕 @Entity 테이블과의 매핑 @Entity가 붙은 클래스는 JPA가 관리하는 것으로, 엔티티라고 불림 제약조건 필드에 final, enum, interface, class 사용불가 생성자 중 기본 생성자가 반드시 필요함 속성 Name - 엔티티 이름을 지정, 기본값으로 클래스 이름을 그대로 사용함 📕 @Table 엔티티와 매핑할 테이블을 지정 생략 시 매핑한 엔티티 이름을 테이블 이름으로 사용 속성 Name - 매핑할 테이블 이름을 지정 Catalog - DB의 Catalog를 매핑 Schema - DB 스키마와 매핑 Uniq..