본문 바로가기

프로그래밍/Troubleshooting

(5)
[Spring] @Transactional이 비동기(Async)를 만났을 때 벌어지는 일들 애플리케이션 성능을 위해 비동기 처리는 필수적이다. 비동기로 DB 작업을 처리했는데, 트랜잭션이 적용되지 않거나 롤백이 되지 않는 문제를 겪어 글을 정리하여 남기기로했다. 아래에 작성하는 코드들은 실제 테스트한 코드가 아니라 많이 축약한 예시코드입니다. 잘못된 내용이 있다면 피드백 부탁드립니다. 네가지 시행착오가 있었는데 하나씩 정리해보겠다. 1. @Transactional이 붙은 메소드 안에서 CompletableFuture로 비동기 작업을 실행 (트랜잭션이 전파되지 않음)@Transactionalpublic CompletableFuture updateData() { return CompletableFuture.runAsync(() -> { repository.save(entity);..
JPA 순환 참조, API 호출 시 순환 참조가 발생하는 이유 JPA의 순환 참조란 객체 간의 상호 참조가 무한 반복되는 경우를 말한다.객체 그래프에서 한 객체가 다른 객체를 참조하고, 그 다른 객체가 다시 처음 객체를 참조하는 상황이고 스택 오버 플로우가 발생할 수 있다. 사이드 프로젝트 진행 하던 도중 Service 단 개발을 끝내고 API를 만들다가 스택 오버 플로우가 발생 하였다.순환 참조를 미쳐 신경쓰지 못하고 있었음.. 순환 참조를 잘 예방해야겠다고 다시 한 번 생각함 Service를 테스트 할 때 까지만 해도 발생하지 않았던 문제인데 REST API를 구현하면서 문제가 발생한 이유는ResponseBody를 구현할 시 Object 형태의 값을 직렬화를 이용해 JSON 형태로 변환하는데 이 때 순환 참조가 발생하기 때문이다. public class Ord..
우연히 알게된 Mybatis의 캐시 Cache MyBatis를 사용하여 만든 프로젝트를 Jdbc Template으로 변경하고 있는 와중에 잘 성공하던 테스트 하나가 실패했다. 대충 시나리오를 설명하자면MemberService.findById 는1. MemberRepository.findById 를 호출하여 Member를 찾고2. ReserveRepository.findByMemberId 를 호출 하여 List를 찾고3. Member의 List를 채워서 반환해준다. 그런데 테스트에서 MemberService.findById 를 호출 후, 다른 함수에서 MemberRepository.findById 를 호출하고 Member.getReserve로 List를 조회하고 있었다. 당연히 MemberRepository.findById는 Member에 List는..
Spring Message, properties 한글 깨짐 해결 애플리케이션에 Message를 적용할 때 한글로 입력해놓은 메시지들이 ???. 로 깨지는 경우가 있다. 설정 -> 파일 인코딩전역 인코딩 : UTF-8프로젝트 인코딩 : UTF-8프로퍼티 파일에 대한 디폴트 인코딩 : UTF-8 모두 변경 후 IDE를 재시작 한다. 재시작 하면 이 전에 properties 에 입력해놓은 한글들이 ???.로 변경되어있다. 한글로 다시 입력해주고 실행하면 해결된다.
Nginx WebSocket 설정, Nginx WebSocket 안될 때 웹 사이드 프로젝트 진행 중 실시간 채팅, 알림 기능을 WebSocket을 이용하여 구현했다. AWS EC2 서버에 프로젝트를 배포하고 WebSocket으로 구현한 채팅, 알림 기능도 별 문제없이 동작하였는데. *탄력적 IP DNS, 8080 포트로 접근const socket = new WebSocket('ws://주소:8080/chatroom'); 자동 배포, 무중단 서비스를 만들기 위해 Nginx를 사용하는 순간 WebSocket 연결에 문제가 생겼다. 배포 과정에 서비스가 중단되지 않기 위해 Nginx 리버프 프록시를 이용해 8081, 8082 포트에 번갈아 가며 요청을 전달 하도록 하였는데 ( 이 과정은 생략 ) Nginx는 80(http), 443(https) 포트를 할당하며, 80번 포트는 기..