본문 바로가기

전체 글

(76)
[Spring] 트랜잭션 전파(Transaction Propagation) 트랜잭션 전파 트랜잭션이란 데이터베이스의 상태를 바꾸는 작업의 단위로 @Transactional을 메서드나 클래스에 선언하여 작업의 범위를 지정한다. 트랜잭션은 설정값에 따라 하나의 트랜잭션이 실행중일 때 다른 트랜잭션을 실행하면 기존의 실행중이던 트랜잭션에 종속되기도 하고 아예 새로운 트랜잭션이 실행되기도 하는데 이를 트랜잭션 전파(Transaction Propagation)라고 한다. 이번 글에서는 트랜잭션 전파 옵션의 종류와 의미, 그리고 적용예시에 대해서 정리해 보려고 한다. 트랜잭션 전파 옵션 REQUIRED 트랜잭션 전파의 기본 설정이다. 실무에서 가장 많이 사용되는 옵션으로 기존 트랜잭션이 없으면 새로 생성하고 있으면 참여한다. 기존 트랜잭션이나 신규 트랜잭션 중 하나라도 롤백이 발생하면 ..
[Spring] @Transactional 호출 시 주의사항 Spring 프레임워크에서 제공하는 @Transactional 어노테이션을 사용하면 트랜잭션 AOP가 적용된다. 이 트랜잭션 AOP는 프록시 방식의 AOP를 사용하며 프록시 객체가 먼저 클라이언트의 요청을 받고 트랜잭션 처리를 한 후 실제 객체를 호출해준다. 만약 프록시 객체를 거치지 않고 실제 객체를 직접적으로 호출하게 되면 트랜잭션 AOP가 적용되지 않고 트랜잭션도 시작하지 않는다. 일반적으로 @Transactional 어노테이션을 선언하면 프록시 객체가 빈으로 등록되고 의존성 주입할 때도 프록시 객체를 주입하기 때문에 위와 같은 상황이 발생하지 않지만 실제 객체 내부에서 메서드 호출이 일어나면 프록시 객체를 거치지 않고 대상 객체를 직접 호출하기 때문에 트랜잭션이 적용되지 않는 경우가 발생한다. 예..
Handshake failed due to invalid Upgrade header: null 문제상황 SSAFY 자율 프로젝트에서 채팅 기능을 구현하는데 잘 동작하던 기능이 HTTPS를 적용하고 나서는 콘솔에 아래와 같은 에러가 발생하면서 채팅방에서 소켓연결이 실패했었습니다. 백엔드단에서도 로그를 확인해 보니 동일한 에러가 발생했습니다. (개발할 때 에러메세지를 캡처하지 못해서 문제를 해결할 때 참고했던 블로그의 사진을 인용하였습니다.) "Handshake failed due to invalid Upgrade header: null" 내 기존 location 들 , 아래를 추가 velog.io 해결방법 Websocket 프로토콜은 서버와 클라이언트 간의 메세지 교환을 위한 통신 프로토콜로 양방향 통신을 지원하며 실시간 네트워크를 구현하는데 주로 사용됩니다. HTTP 프록시 및 중간 층을 지원하..
OSI 7계층, TCP/IP 4계층 OSI 7계층(물-데-네-전-세-표-응) OSI 7계층은 네트워크 통신이 일어나는 전과정을 7개의 단계로 표준화 한 것입니다. 이렇게 표준화 함으로써 통신이 일어나는 과정을 단계별로 파악할 수 있어, 문제가 발생했을 때 해당 문제를 해결하기 용이해집니다. 각 계층은 물리 계층 - 데이터링크 계층 - 네트워크 계층 - 전송 계층 - 세션 계층 - 표현(프레젠테이션) 계층 - 응용(애플리케이션) 계층 순으로 나뉘며 물리 계층부터 네트워크 계층까지를 하위 계층, 전송 계층부터 응용 계층까지를 상위 계층이라고 합니다. 하위 계층 : 물리 계층 - 데이터 링크 계층 - 네트워크 계층 상위 계층 : 전송 계층 - 세션 계층 - 표현 계층 - 응용 계층 물리 계층 물리 계층은 전송에 필요한 두 물리적 장치 간의 기계..
[Spring] 비동기 통신과 데이터 동기화를 위한 카프카 활용 (2) EC2 서버에서 Kafka, zookeeper 컨테이너 실행하기 version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" networks: my-network: ipv4_address: 172.18.0.100 kafka: image: wurstmeister/kafka ports: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: 172.18.0.101 KAFKA_CREATE_TOPICS: "test:1:1" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker...
[Spring] CORS 이란? CORS 에러 해결방법 프로젝트를 할때마다 CORS 설정을 해주고 있지만 매번 CORS 에러를 만나는게 정확한 이해없이 사용하고 있는 것 같아 한번 정리하고 넘어가려고 합니다. CORS 란? CORS란 Cross Origin Resource Sharing의 약자로 출처가 다른 리소스들을 공유하는 것을 의미합니다. 여기서 출처란 프로토콜, 호스트, 포트로 구성된 서버 위치를 의미하는데 두 리소스들 간에 프로토콜, 호스트, 포트 중 하나만 달라도 다른 리소스에서 요청을 보냈을 때 CORS 에러가 발생합니다. ex) https://spring.io:8080 프로토콜 : https, http 호스트 : spring.io 포트 : 8080 그렇다면 왜 이처럼 출처가 다른 리소스의 요청을 막는 것일까? 출처가 다른 리소스를 공유하여 브라..
[Spring] 비동기 통신과 데이터 동기화를 위한 카프카 활용 (1) 2023.03.19 - [Spring] - [Spring] MSA 프로젝트 만들기 (1) [Spring] MSA 프로젝트 만들기 (1) 2023.02.28 - [Server] - [Spring] 마이크로서비스 아키텍쳐 (Micro Service Architecture, MSA) [Spring] 마이크로서비스 아키텍쳐 (Micro Service Architecture, MSA) 이번에 블록체인 기반의 프로젝트를 진행하게 되었는데 keylog.tistory.com 이전에 MSA 프로젝트를 개발 할때 OpenFeign 라이브러리를 사용하여 동기 방식으로 마이크로 서비스들 간에 내부 통신을 구현했는데 이제 비동기 방식으로 통신하고 동일한 기능을 가진 마이크로 서비스들 간에 데이터를 동기화 하기 위해 카프카에 대..
[JPA] deleteAll() 수행 후 바로 insert 했을 때 duplicate entry 에러가 발생하는 문제 프로젝트를 진행하면서 아래와 같은 로직을 작성했었습니다. 백준 이메일을 수정했을때 데이터베이스에 저장된 수정되기 전 백준 이메일로 푼 문제 리스트를 전부 삭제한 후 수정할 이메일로 푼 문제리스트를 다시 저장하는 로직입니다. @Override @Transactional public GithubBaekjoonResponseDto updateGithubAndBaekjoon(Long userId, GithubBaekjoonRequestDto requestDto) { User user = getUser(userId); user.updateEmail(requestDto.getGithub(), requestDto.getBaekjoon()); solvedacRepository.deleteAllByUserId(user...