Spring & JPA 11

[테코톡] Lock & JPA Lock

출처: https://www.youtube.com/watch?v=LDi5muN2kgI&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=186  Lock은 무엇일까?데이터 수정을 위한 커넥션이 여러 개 존재할 때 데이터 일관성의 문제가 발생 -> 이를 해결하기 위한 메커니즘  Lock과 Transaction?Lock: 일관성 보장, 동시성 제어 메커니즘트랜잭션: 원자성 보장 (All or Nothing)트랜잭션 격리 수준: 여러 트랜잭션에 대하여 각 트랜잭션 처리 전략구현 방법 중 하나가 락 Lock 전략낙관적 Lock(=애플리케이션 Lock): 트랜잭션 충돌이 발생한 후 조치비관적 Lock(=데이터베이스 트랜잭션 Lock): 트랜잭션 충돌을 가정하고 사용하는 전략 JPA..

Spring & JPA 2025.04.05

[테코톡] JPA 연관관계 최적화

연관관계란?JPA: Java 애플리케이션에서 관계형 데이터베이스의 데이터를 관리하는데 필요한 객체와 관계를 매핑하는 API엔티티: 데이터베이스 테이블에 대응되는 객체. 각 엔티티는 특정한 데이터 모델을 표현JPA 연관관계: JPA 엔티티 간의 관계를 정의 왜 연관관계를 이해해야 할까?애플리케이션 내 데이터를 효율적으로 구성하기 위해성능 향상, 데이터 무결성, 데이터 관리, 유지 보수, 견고한 아키텍처 등 양방향 @OneToMany항상 부모 측에서 자식 측으로 전이 사용@OneToMany(cascade = CascaseType.ALL) 단방향 @OneToMany부모 자식 연관관계를 관리하기 위한 연결 테이블 생성자식 엔티티에 부모의 외래키를 저장할 수 없어 별도의 연결 테이블 생성연결 테이블로 인한 비효율..

Spring & JPA 2025.04.03

[테코톡] API 중복 호출 해결기

출처: https://www.youtube.com/watch?v=FEP2BzNzoRw&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=24 문제 상황7주년 쿠폰 발급 행사1명의 사용자는 1개의 쿠폰을 발급 받아야 한다.여러 브라우저에서 동시에 동일한 API를 호출한다면?* 프론트엔드 관련 내용 생략  서버에 검증 로직을 추가validateAlreadyIssued 메서드를 통해 사용자가 쿠폰을 발급 받았는지 확인-> DB에 한 사용자가 쿠폰을 여러 개 발급 받은 것을 확인! 2개 요청이 '동시'에 들어온다면?두 개의 메서드가 동시에 DB 트랜잭션을 시작발급 확인 메서드를 통과하게 됨 해결 방법자바 동기화 동구분산락유니크 제약 조건트랜잭션 격리 수준select ... for..

Spring & JPA 2025.04.02

고급 매핑 - 3. 복합 키와 식별 관계 매핑

식별 관계 vs 비식별 관계외래 키가 기본 키에 포함되는지 여부에 따라 식별 관계와 비식별 관계로 구분식별 관계부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계 비식별 관계부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계필수적 비식별 관계: 외래 키에 NULL을 허용하지 않는다.선택적 비식별 관계: 외래 키에 NULL을 허용한다. 복합 키: 비식별 관계 매핑둘 이상의 컬럼으로 구성된 복합 기본 키는 매핑 오류가 발생한다.JPA에서 식별자를 둘 이상 사용하려면 별도의 식별자 클래스를 만들어야 한다.JPA는 영속성 컨텍스트에 엔티티를 보관할 때 엔티티의 식별자를 키로 사용한다. 그리고 구분을 위해 equals와 hashCode를 사용해서 동등성 비..

Spring & JPA 2025.03.19

고급 매핑 - 2. @MappedSuperclass

상속 관계 매핑: 부모 클래스와 자식 클래스 모두를 데이터베이스 테이블과 매핑단순히 매핑 정보를 상속할 목적으로만 사용부모 클래스는 테이블과 매핑하지 않고 상속받는 자식 클래스에게 매핑 정보만 제공하고 싶을 때 @MappedSuperclass를 사용 예제 코드@MappedSuperclasspublic abstract class BaseEntity { @Id @GeneratedValue private Long id; private String name; // ...}@Entitypublic class Member extends BaseEntity { private String email; // ...}@Entitypublic class Seller exte..

Spring & JPA 2025.03.19

고급 매핑 - 1. 상속 관계 매핑

- 프로젝트의 ERD를 검토해보고자 관련 내용을 공부하고 있다.- 데이터베이스 위주로 성능을 개선하고자 한다.ORM에서 이야기하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것슈퍼타입 서브타입 논리 모델을 테이블로 구현하는 방법각각의 테이블로 변환: 조회 시 조인을 사용. JPA에서는 조인 전략이라 한다.통합 테이블로 변환: 테이블을 하나만 사용해 통합. JPA에서는 단일 테이블 전략이라 한다.서브타입 테이블로 변환: 서브 타입마다 하나의 테이블을 만듦. JPA에서는 구현 클래스마다 테이블 전략이라 한다.조인 전략엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본키를 받아서 기본 키 + 외래 키로 사용하는 전략조회할 때 조인을 자주 사용테이블 ..

Spring & JPA 2025.03.19

연관관계

요즘 자소서를 쓰면서 스스로 너무 부족한 사람이라는 것을 실감하게됐다...우울하기도 했지만 동기부여로 삼고 열심히 공부해보자.관련 오류도 수정할 겸 연관관계를 복습하고자 한다. 참고: 책 '자바 ORM 표준 JPA 프로그래밍'양방향 연관관계일대다 연관관계일 때데이터베이스 테이블은 외래 키 하나로 양방향으로 조회 가능 -> 처음부텅 양방향 관계 연관관계 매핑- 회원 엔티티@Entitypublic class Member { // 중략 @ManyToOne @JoinColumn(name = "userId") private User user; // 연관관계 설정 public void setTeam(Team team) { this.team = team; }..

Spring & JPA 2025.03.17

[고대로] Redisson을 통한 분산 락 적용

기존 배포 서버를 1개 사용하고 있었지만 최근 ECS로 배포 방법을 변경함에 따라 여러 컨테이너가 같은 DB 데이터에 접근할 수 있게 되었다. (사실 기존에도 개발용 서버를 배포하였기 때문에 상황은 동일하다...) 서버가 늘어날 수록 같은 데이터를 수정하는 스케줄러가 동시에 여러 개 시작되어 문제가 발생할 수 있기 때문에 이를 예방하기 위해 분산 락을 적용해야 할 필요성을 느꼈다. 특정 쿼리로 인해 발생할 수 있는 동시성 문제를 해결한다기보다 매일 정해진 스케줄러로 인한 문제를 예방하기 위한 것이므로 특정 서버 1개만 스케줄러를 실행해야 하는 상황이다. 즉 네임드 락을 적용하고자 한다. Spring Data JPA를 사용하는 방법과 Redis를 사용하는 방법이 있는데, 기존에 Redis도 ECS 서비스로..

Spring & JPA 2025.03.05

[고대로] static 변수와 영속성 컨텍스트

https://jinjinjincode.tistory.com/313 [고대로] 운영 시간 관리Devkor에서 '고대로'라는 학교 안내 어플을 개발하는 활동을 하고 있다.학교의 건물, 강의실, 편의시설 등의 운영시간을 관리할 필요성이 생겨 해당 기능을 맡아 구현하였다. 프로젝트를 시작하jinjinjincode.tistory.com 운영 시간 관리를 구현하면서 영속성 컨텍스트 때문에 운영 시간 변동이 제대로 반영되지 않았던 오류가 발생하였다. 문제 상황기능 구현 이후에 DB를 확인하던 중 운영하고 있는 시간임에도 건물의 isOperating이 false임을 발견하였다. 우선 해당 건물이 운영 중이라고 판단하는 로직에 오류가 발생해 false로 값이 저장되었나 싶어서 log.info로 확인해보았는데 스케줄러가..

Spring & JPA 2024.08.17

[고대로] 운영 시간 관리

Devkor에서 '고대로'라는 학교 안내 어플을 개발하는 활동을 하고 있다.학교의 건물, 강의실, 편의시설 등의 운영시간을 관리할 필요성이 생겨 해당 기능을 맡아 구현하였다. 프로젝트를 시작하면서 학교 시설을 건물, 강의실, 편의시설로 구별하였다.초반에 구상한 내용인데, 지금 생각해보면 강의실과 편의시설을 따로 구분할 필요성이 없지 않았을까라는 생각이 들기도 한다. 아무튼 건물과 강의실, 건물과 편의시설은 일대다 연관관계를 맺고 있으며 강의실과 편의시설은 건물과 독립된 운영시간을 가지고 있다.가장 처음에는 각 시설에 operatingTime을 "00:00-00:00"과 같은 형식으로 저장하여 해당 String을 가지고 운영 여부 true/false를 판단하면 되지 않을까?라고 생각했다. 문제 상황그러나 ..

Spring & JPA 2024.08.17