전체 글

Spring

[JPA] 일대다(1:N), 다대일(N:1) 관계

JPA의 일대다, 다대일 관계에 대해 알아보자. 일대다(1:N) 데이터베이스에서 일대다 관계는 굉장히 다양한 경우에 적용될 수 있다. 예를 들어, 장바구니와 담긴 상품, 교실과 학생, 게시판과 게시글 등이 있다. 이런 관계를 구현하기 위해 @OneToMany 어노테이션을 이용하여 다음과 같이 구현할 수 있다. 다음은 주문과 상품의 관계에 대한 일대다 양방향 관계를 나타낸 코드이다. @Entity public class Order { // ... @OneToMany(mappedBy = "order") private List products = new ArrayList(); // ... } @Entity public class Product { // ... @ManyToOne @JoinColumn(name ..

Spring

[JPA] 연관관계의 주인

JPA를 사용하며 알아야할 개념중 '연관관계의 주인'에 대해서 살펴보자. 연관관계의 주인이란? JPA에서 연관관계의 주인은 엔티티 간의 양방향 연관관계를 관리하는데 중요한 역할을 하는 개념이다. 양방향 연관관계란 두 개의 엔티티 클래스가 서로를 참조하고 있는 상태를 의미한다. 연관관계의 주인은 일반적으로 두 개의 연관관계 테이블중 외래키를 가지고 있는 테이블에 해당하는 엔티티가 연관관계의 주인이 된다. 연관관계의 주인을 엔티티간의 관계를 주도하고 관리하게 된다. 주인 엔티티의 필드를 사용하여 연관관계 간의 관계를 매핑하며, 이 필드는 데이터베이스 테이블에 반영된다. 더불어 연관관계의 주인이 아닌 엔티티는 읽기 전용(Read-Only) 엔티티로 사용되게 된다. 주인 엔티티가 데이터베이스에 영향을 미치기 때..

Computer Sience

[CS]경쟁 상태(Race Condition)과 교착 상태(Dead Lock)

경쟁 상태(Race Condtion) 이란? 경쟁 상태는 두 개 이상의 스레드 또는 프로세스가 공유 자원에 동시에 접근하고 수정을 시도할 때 발생 할 수 있는 문제이다. 즉 병행 프로그래밍 또는 동시성 프로그래밍 환경에서 발생하는 문제로써, 스레드 간의 실행 순서가 예상과 다를 경우 의도와 다른 결과가 발생하며 프로그램의 정확성과 안정성을 저해하는 결과 유발한다. 경쟁 상태가 발생하는 기본적인 원인은 다음과 같다. 1. 동시성 접근 : 여러 스레드 또는 프로세스가 동시에 공유자원(변수, 파일, 데이터베이스)에 접근하려 할 때 발생한다. 2. 비원자성(Non-atomic) 연산 : 공유 자원을 수정하는 연산이 원자적이지 않을 경우, 즉 여러 단계로 나눠서 수행되는 경우 발생할 수 있다. *원자적 : 수행 ..

Spring

[Spring] 서비스 운영간 발생한 DB Connection Closed 이슈

장애 발생 및 발견8월 24일 서버 정기점검이 이루어지던 새벽정기점검 대상이 아닌 서버의 특정 인스턴스에 인입된 요청들이 'SQLException : Connection Closed' 오류로 모두 500처리가 되는 이슈가 발생하였다. 24일 3시 43분에 처음 발생한 이슈는 오전 9시 45분에 이슈사항으로 확인되었고 전사에 전파 및 담당자인 나에게 전달되게 되었다.( 약 6시간의 장애 시간의 텀은 너무 부끄러운 장애대응이다.. ) 장애 대응오전 9시 45분, 전사 장애 대응 채널에 내이름이 멘션되어 호출되기 시작했고, 해당 시스템은 팀내에서 개발한것이 아닌 외주업체에서 관리하고 있었기에 담당 업체에 연락하여 원인 파악 및 조치를 요청하였다. 오전 10시 03분, 담당 외주 업체에서의 조치 이전에 인프라팀..

Database

[Database] Ms-SQL DeadLock 이슈 처리

이슈사내 회원 서비스 운영중 로그인 과정에서 '트랜잭션이 잠금 리소스에서 다른 프로세스와의 교착 상태가 발생하여 실행이 중지되었습니다. 트랜잭션을 다시 실행하십시오.'에러와 함께 서버로 들어온 요청이 처리되지 못하고 Error가 발생한 부분을 모니터링을 통해 감지됨. 해당 이슈가 발생한 DataBase는 Ms-SQL 사용중이었으며,각각 [05:47:300], [05:47:726] 요청시간으로 같은 회원에 의해 동일한 요청이 거의 비슷한 시간에 들어오게 됨 요청 1의 경우 긴 지연시간을 가진후 정상 처리 되었고,요청 2의 경우 요청 1의 지연시간을 대기하다 위와 같이 DeadLock 처리됨.원인 및 해결DeadLock이 발생한 원인을 파악하기 위해 다양한 추론을 통해 접근 1. 로직 처리시간이 느리기 때문..

Spring

[Spirng, JPA] object references an unsaved transient instance - save the transient instance before flushing

이슈org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushingJPA 연관관계를 이용해 저장하려던 중 위와 같은 오류 발생 원인연관관계에 놓인 두 엔티티를 저장하려 할때, 부모 엔티티의 FK가 영속되지 않아 발생한 오류나의 경우 다대다 관계에 대한 테스트중 자식 엔티티를 바라보는 부모 엔티티의 필드 값이 영속 시점에 적절히 저장되지 않아 발생한 이슈 해결연관관계 엔티티를 함께 저장하기 위해서 Cascade 옵션을 통해 부모 엔티티가 저장될때 자식 엔티티가 함께 저장되도록 처리한다. @ManyToMany(cascade = C..

Spring

[Spring] 구글 OAuth2.0 이용 소셜 로그인 구현

구글 OAuth2.0을 이용한 소셜 로그인 구현 구글에서 제공하는 OAuth2.0을 이용해야 하기에, 관련 로그인 기능 사용 신청을 위해 구글 계정 로그인후 구글 클라우드 플랫폼 콘솔로 이동한다. https://console.cloud.google.com/ Google 클라우드 플랫폼 로그인 Google 클라우드 플랫폼으로 이동 accounts.google.com 구글 클라우드 플랫폼에서 새로운 프로젝트를 생성한다. 프로젝트 생성 완료이후, API 및 서비스 탭의 OAuth 동의 화면으로 이동하여 필요한 설정을 진행한다. OAuth 동의 화면에서 앱 이름, 이메일등 필수 값을 입력후 '저장 후 계속' 버튼을 클릭한다. API 및 서비스 - 사용자 인증 정보 탭으로 이동하여 OAuth2.0 클라이언트를 생..

Spring

[JPA]연관관계 - 다대다(N:M)

JPA 연관관계 다대다(N:M) 실무에선 보통 사용하지 않는것을 권장한다. 관계형 데이터베이스에서 정규화된 2개의 테이블로 다대다를 표현할 수 없다. 관계형 데이터베이스에서 다대다를 표현하기 위해서는 중간 테이블을 통해 일대다, 다대일로 나누어서 표현해야한다. JPA에서는 관계형 데이터베이스가 중간 테이블을 만드는 것과 달리 @ManyToMany 어노테이션을 통해 별도의 중간 테이블에 해당하는 엔티티를 만들지 않고도 다대다를 표현할 수 있다. 단방향 다대다 다대다 관계를 JPA를 통한 단방향 구현시 아래와 같이 코드 작성이 가능하다. Member (연관관계의 주인) @Entity @Table(name = "member") @Getter public class MemberEntity { @Id @Gener..

turtleDev
거북한 개발자의 기록