- [트러블 슈팅] 배포 서버 CI 자동화 적용 이후 오류 발생2025-01-22 14:07:50배포 서버 CI 자동화 적용 이후 오류가 발생했다.AWS EC2 에서 docker에 올라온 log를 확인해보니 IncorrectResultSizeDataAccessException 이 발생한 것을 확인위의 오류 내용을 보면 쿼리 결과값이 유니크하지 않아서 발생했고, 2개의 결과를 반환했다고 되어있다.이 오류는 JPA 레포지토리에서 save 메서드를 통해 데이터 저장을 하면서 발생한 예외이다. 저장하고자 하는 데이터가 db에 이미 존재를 하고 Unique 값을 포함한 데이터인데 데이터 중복이 발생하여 예외가 발생했다. IncorrectResultSizeDataAccessException 에러는 데이터 조회 시 발생하는 에러인데 왜 저장할 때 문제냐고 한다면 // 테스터 생성 코드Member memberA ..
- Connection Timeout, Socket Timeout, Read Timeout의 차이점은 무엇인가요?2025-01-21 22:08:59Connection Timeout은 클라이언트가 서버에 연결을 시도할 때, 일정 시간 내에 연결이 이루어지지 않으면 발생하는 타임아웃입니다.TCP 소켓 통신에서 클라이언트와 서버가 연결될 때, 정확한 전송을 보장하기 위해 사전에 세션을 수립하는데, 이 과정을 3-way-handshake라고 합니다.Connection Timeout은 이 3-way-handshake가 일정 시간 내에 완료되지 않을 때 발생합니다.즉, 서버의 장애나 응답 지연으로 인해 연결을 맺지 못하면 Connection Timeout이 발생합니다. Socket Timeout은 Connection Timeout 이후에 발생할 수 있는 타임아웃입니다.클라이언트와 서버가 연결된 후, 서버는 데이터를 클라이언트에게 전송합니다.이때 하나의 데이터..
- private 메서드에 @Transactional 선언하면 트랜잭션이 동작할까요?2025-01-20 12:16:17기본적으로 @Transactional, @Cacheable, @Async 등의 애너테이션은 런타임에 동작하는 Spring AOP를 기반으로 동작합니다.Spring AOP가 제공하는 JDK Dynamic Proxy, CGLIB 방식 모두 타깃이 구현하는 인터페이스나 구체 클래스를 대상으로 프록시를 만들어서 타깃 클래스의 메서드 수행 전후에 횡단 관심사에 대한 처리를 할 수 있습니다. Spring은 빈 생성시, 해당 빈에 AOP 애너테이션이 있는지 검사하고, 있다면 프록시 객체를 생성하여 빈을 대체합니다. AOP 적용 대상인 클래스의 경우, 즉, @Transactional과 같은 AOP 애너테이션이 하나라도 선언된 클래스는 프록시로 감싸집니다. JDK Dynamic Proxy의 경우 타깃 클래스가 구현하는 ..
- 리버스 프록시와 포워드 프록시의 차이점에 대해 설명해주세요.2025-01-17 10:27:41포워드 프록시(Forward Proxy)포워드 프록시는 주로 클라이언트 측에 위치하여, 사용자가 인터넷에 접근할 때 중개자 역할을 합니다.예를 들어, 회사 내부 네트워크에서 근무하는 직원이 외부 웹사이트에 접속하려고 할 때, 포워드 프록시 서버를 통해 요청이 전달됩니다. 이 과정에서 사용자의 실제 IP 주소는 숨겨지고, 프록시 서버의 IP 주소가 대신 사용됩니다.포워드 프록시의 핵심 기능 중 하나는 익명성 제공입니다. 사용자의 실제 IP를 숨김으로써 개인정보 보호와 보안 측면에서 큰 장점을 제공합니다.또한 캐싱을 통해 네트워크 성능을 향상시킵니다. 자주 요청되는 웹 페이지나 파일을 프록시 서버에 저장해두면, 동일한 요청이 다시 들어올 때 빠르게 응답할 수 있어 네트워크 대역폭을 절약할 수 있습니다. ..
- 뱃지 시스템 적용2025-01-15 22:42:58뱃지 종류다양한 업적들이 추가되도 문제되지 않게 확장성을 고려해 만드려고 한다.첫 발자국앱에 최초 가입 시 얻을 수 있는 뱃지이다.완벽한 첫 인상프로필 사진, 개인 정보, 자문자답 모두 입력 시 얻을 수 있는 뱃지이다.첫 인사첫 채팅 메시지를 보내면 얻을 수 있는 뱃지이다.하트 전도사다른 사람의 프로필에 좋아요 50번 이상 누르면 얻을 수 있는 뱃지이다.첫 승리토너먼트에서 첫 승리 시 얻을 수 있는 뱃지이다.새싹(10개) - 유명인(100개)자신의 좋아요 수 10개 달성하면 얻을 수 있는 뱃지이다.요구사항업적을 달성하면 뱃지를 받을 수 있다.- 달성하는 순간 받아진다.업적을 달성하면 보상을 받을 수도 있다.- 보상은 아직 미정마이페이지에서 나의 뱃지의 개수를 볼 수 있고, 클릭 시 최대 9개의 뱃지가 보..
- CORS란 무엇인가요?2025-01-15 10:22:04CORS(Cross Origin Resource Sharing)는 출처가 다른 곳의 리소스를 요청할 때 접근 권한을 부여하는 메커니즘입니다. 리소스를 주고받는 두 곳의 출처가 다르면 출처가 교차한다고 합니다. 이때 출처는 URL뿐만 아니라 프로토콜과 포트까지 포함됩니다. 만약 클라이언트의 출처가 허용되지 않았다면 CORS 에러가 발생할 수 있습니다.CORS는 왜 필요한가요?과거에는 크로스 사이트 요청 위조(CSRF, Cross-Site Request Forgery) 문제가 있었습니다. 피해자의 브라우저에서 다른 애플리케이션으로 가짜 클라이언트 요청을 전송하는 공격입니다.CSRF를 예방하기 위해 브라우저는 동일 출처 정책(SOP, same-origin policy)을 구현했습니다. SOP가 구현된 브라우저..
- 갭락(Gap Lock)과 넥스트키 락(Next-Key Lock)이란 무엇이며, 어떻게 Phantom Read를 방지하나요?2025-01-14 16:01:01Phantom Read란 무엇인가요?Phantom Read는 트랜잭션이 동일한 조건의 쿼리를 반복 실행할 때, 나중에 실행된 쿼리에서 처음에는 존재하지 않았던 새로운 행이 나타나는 현상을 말합니다. 이는 주로 읽기 일관성(Read Consistency) 을 유지하는 과정에서 발생할 수 있는 문제로, 데이터의 삽입이나 삭제가 다른 트랜잭션에 의해 이루어질 때 발생합니다.-- 트랜잭션 A 시작START TRANSACTION;-- 트랜잭션 A 첫 번째 조회SELECT * FROM orders WHERE amount > 150;-- 트랜잭션 B 시작START TRANSACTION;-- 트랜잭션 B 새로운 행 삽입INSERT INTO orders (customer_id, amount) VALUES (4, 250)..
- [트러블 슈팅] 알림 내역 조회 문제2025-01-13 22:43:51문제상황알림 내역은 회원이 읽지 않은 복습 알림을 쌓아두는 기능이다.알림 내역을 확인하려 하니까 404 에러가 발생하는 문제가 생겼다. 아래 코드 부분에서 에러가 발생한 것이다.api를 호출하면서 404에러가 발생할 문제가 무엇인지 확인해보자..// 알림 조회 API 호출const getNotifications = async () => { try { const response = await axiosInstance.get('/v1/api/notification/own/unchecked'); setNotifications(response.data.data); } catch (error) { console.error("알림을 가져오는 중 오류 발생:", err..