이전에 했던 프로젝트들에 대해선 테스트코드는 작성하지 않았다. 작성했다 해도 왜 테스트코드를 작성하는지도 잘 모르고 대충 끄적여본게 다였다. tickerBell 프로젝트를 진행하면서 통합테스트, 단위테스트를 진행하며 완성도 높은 프로젝트를 완성해보려 한다. 우선 단위테스트에 많이 사용하는 Mock, Mockito에 대해 소개하고자 한다. Mock이란? Mock은 한글로 "모의, 가짜의"라는 뜻으로 테스트할 때 필요한 실제 객체와 동일한 모의 객체를 만들어 테스트의 효용성을 높이기 위해 사용한다. 예제를 보면서 왜 Mock을 사용하는지 알아보자 @Service public class StudyService { public Student getStudent() { // DB에서 study 테이블 조회 (부하..
프로젝트를 ec2에 배포해 뒀는데 자꾸 서버가 뻗는 현상이 발생했다. 처음 켰을 땐 속도도 빠르고 괜찮다가 2~3시간 뒤 접속해보면 느려져있고 다음 날 접속하면 뻗어있었다. 처음 켰을 땐 괜찮다가 시간이 지나 뻗는걸 보아 메모리 누수가 일어나나 싶었다. 그래서 찾아보게된 자바 메모리 누수(memory leak).. 메모리 누수(memory leak)란? CS 의미로 살펴볼 때, 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상이다. JAVA는 기본적으로 Garbage Collection을 지원한다. 하지만 더 이상 사용되지 않는 객체들이 가비지 컬렉터에 의해 회수되지 않고 계속 누적이 되는 현상을 말한다. Java GC의 회수 대상이 되지 않는 경우에 대해 알아보자 1. 무의미한 Wrap..
우선 부모엔티티와 자식 엔티티의 코드는 다음과 같다. 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대 요소를 모두 사용할 수 있다. 스프링 배치를 사용하는 경우는 다음과 같다 대용량의 비즈니스 데이터를 복잡한 작업으로 처리해야하는 경우 특정한 시점에서 스케쥴러를 통해 자동화된 작업이 필요한 경우 대용량 데이터의 포맷을 변경, 유효성 검사 등의 작업을 트랜잭션 안에서 처리 후 기록해야하는 경우 스프링 배치의 만족 조건 대용량 데이터 : 대량의 데이터를 가져오..