우선 부모엔티티와 자식 엔티티의 코드는 다음과 같다. Ticketing 과 SelectedSeat은 1:N 연관관계 매핑이 맺어져있다. cascade.REMOVE 옵션을 걸어 티켓 예매를 취소할 경우 SelectedSeat도 삭제할 생각이었고 아래와 같이 코드를 작성했다. 하지만 selectedSeat의 참조 에러가 터졌다. Cannot delete or update a parent row: a foreign key constraint fails (`tickerBellDB`.`selected_seat`, CONSTRAINT `FKsfrjmwj259n0yrhm0f0idjnrc` FOREIGN KEY (`ticketing_id`) REFERENCES `ticketing` (`ticketing_id`)) 쿼리..
메모리 부족으로 인한 장애 ec2엔 다양한 스펙을 설정할 수 있다. 프로젝트 배포 전이었고 테스트 단계였기에 당연히 t2.small로 잡아두었다. 하지만 서버를 실행한 뒤 시간이 지나면 어느샌가 ec2가 뻗어있었다. 이유는 메모리 문제였다. 현재 사용중인 메모리 양을 확인해 봤더니 거의 모든 메모리를 잡아먹고 있었다. 하지만 그렇게 크지도 않은 서버 하나를 실행했다고 1GB 의 메모리를 다 잡아먹는게 의아했고 여러 사람들한테 물어봤지만 로직이 문제인거 아니냐는 답변을 많이 듣게 됐다. 메모리 누수 의심 메모리 누수가 되는 부분이 있는가 해서 JAVA GC에 대해 알아보기도 했지만 내 상황에 해당하진 않았다. GC에 소멸되지 않는 여러 상황들이 많았지만 그 중 내가 실수할 수도 있겠다 하는 부분은 Map ..
sse를 사용한 실시간 알림 서비스 구현 후 서버가 잘 돌아가다 몇 번 요청 시도 끝에 뻗는 에러가 발생했다. 결론부터 말하면 DB와의 커넥션이 끊어지지않아 생긴 에러였다. 이 에러를 해결 하면서JPA의 OSIV에 대해 다시금 공부할 수 있었다. OSIV (open session in view) OSIV의 동작 원리는 아래와 같다 클라이언트의 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다. 단 이 시점에서 트랜잭션은 시작하지 않는다. 서비스 계층에서 @Transeactional로 트랜잭션을 시작할 때 1번에서 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을 시작한다. 서비스 계층이 끝나면 트랜잭션을 커밋하고 영속성 컨텍스트를 플러시한다. 이 시점에 트랜잭션은 끝내지만 ..
스프링 배치 란? 사용자와 상호작용 없이 여러 개의 작업을 미리 정해진 순서에 따라 중단 없이 처리하는 것이다. Spring Batch는 엔터프라이즈 시스템의 운영에 있어 대용량 일괄처리의 편의를 위해 설계된 가볍고 포괄적인 배치 프레임워크다. Spring의 특성을 그대로 가져왔기 때문에 DI, AOP, 서비스 추상화 등 Spring 프레임워크의 3대 요소를 모두 사용할 수 있다. 스프링 배치를 사용하는 경우는 다음과 같다 대용량의 비즈니스 데이터를 복잡한 작업으로 처리해야하는 경우 특정한 시점에서 스케쥴러를 통해 자동화된 작업이 필요한 경우 대용량 데이터의 포맷을 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야하는 경우 스프링 배치의 만족 조건 대용량 데이터 : 대량의 데이터를 가져오..
각종 공연을 예매하고 알림을 받을 수 있는 서비스를 만들고 있었다. 여기서 예매한 공연의 시작 하루 전 회원들에게 일괄적으로 알림을 보내주는 기능을 구현했다. 카카오톡 알림을 보내려 했지만 사업자 번호가 있어야 한다고 해서 아쉬운데로 sms 전송으로 대체했다. sms push 알림은 naver cloud에서 제공하는 sens를 사용했다. coolsms가 제일 보편적으로 많이 쓰이는 것 같던데 훨씬 저렴하게 사용할 수 있었다. (지금은 사업자만 가능하도록 네이버에서 막음.. 스펨문제) 아무튼 위 기능을 구현하려고 이것저것 찾아보다 스케줄러와 배치에 대해 알게 되었고 현재 진행중인 프로젝트에 스프링 배치를 적용시키기로 했다. 스프링 배치는 어떤 작업에 쓰일까? 예약 시간에 광곳어 메시지 발송, 결제 정산 작..
Docker swarm docker swarm은 컨테이너를 위한 분산 환경 클러스터링 및 스케줄링 도구이다. Docker는 단일 호스트, Docker swarm은 다중 호스트 기반의 컨테이너 기반 애플리케이션 관리 도구이다. "컨테이너화 된 애플리케이션에 대한 자동화된 관리 및 제어를 수행하는 도구" swarm mode를 초기화(init)하여 사용 주요 기능 DNS 서버를 통해 서비스 검색 기능 구현 가능 서비스용 포트를 외부 Load Balancer에 연결하여 부하 분산 구현 각 노드는 TLS(Transport Layer Security) 상호 인증 및 암호화를 통해 노드 간 통신에 대한 보안 기능 구현 Docker엔진과 통합된 multi host기반의 분산 Cluster 운영 서비스에 대한 멀티 호스..