전체 글

전체 글

    트랜잭션 전파 알아보기

    들어가며 웹 애플리케이션을 개발할 때, 흔히 비즈니스 로직이 시작되는 서비스 계층에 @Transactional 어노테이션을 적용해주어 트랜잭션의 경계를 설정하곤 한다. 좀 더 구체적으로는 보통 공통적으로 적용할 트랜잭션 속성을 @Transactional과 함께 작성하여 클래스 레벨에 부여하고, 보다 세밀하게 트랜잭션 속성을 적용해야 할 경우라면 메서드 레벨에 @Transactional을 부여한다. 그렇다면 @Transactional 어노테이션은 매번 새로운 트랜잭션을 생성하는 것일까? 이러한 의문이 들었을 때 트랜잭션 전파에 대해 정리해볼 필요가 있다고 느꼈고, 이에 대해 알아보려고 한다. 트랜잭션 전파 트랜잭션 전파는 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때, 또는 없을 때 어떻게 동작할..

    부하 테스트 및 성능 개선 여행기

    본 포스트는 부스트캠프에서 진행한 벽전 프로젝트의 서버 성능을 개선해보고자 진행한 내용을 정리한 포스트입니다. 들어가며 부하 테스트 툴로는 nGrinder를 사용하였고, 진행 방식은 다음과 같다. 대상 API - 메인 페이지의 랜덤 전시회 조회 API Vuser - 1000명 에러 개선기 부하 테스트를 진행해보았더니 여러 에러가 발생하여 정확한 성능 측정을 할 수 없었다. 따라서 성능 개선을 하기 전에 우선적으로 발생한 에러들에 대해 다루어보려고 한다. Error: worker_connections are not enough 처음으로 발생한 에러는 worker_connections are not enough 였다. 해당 에러는 Nginx의 worker connection이 부족하여 1000명의 가상 유저..

    IP 주소 체계 알아보기

    들어가며 인터넷 상의 Host들은 서로 정보를 주고 받기 위해 네트워크를 타고 통신을 한다. 그런데 이렇게 통신을 할 때 각 Host들이 가지고 있는 고유한 물리 주소인 MAC 주소를 이용하여 다른 네트워크에 속한 목적지 Host와 통신을 한다면 MAC 주소는 비계층적 구조의 고유번호이기 때문에 목적지 Host를 탐색하기 어렵고, 라우팅 테이블 또한 매우 커져 라우터가 다운될 수도 있다. 이로 인해 필요한 것이 IP 주소이다. IP 주소는 네트워크 부분과 해당 네트워크에 속한 Host 부분(계층적 구조의 주소)으로 이루어져 있기 때문에 라우팅 테이블을 네트워크 별로 기록할 수 있게 되고, 이로 인해 목적지 Host를 탐색하는데 훨씬 용이하다. 이제 이러한 IP 주소 체계에 대해서 조금 더 자세히 알아보도..

    AOP와 빈 후처리기를 이용한 부가 기능 분리

    들어가며 다이내믹 프록시를 이용한 부가 기능 분리 포스트에서 트랜잭션이라는 부가 기능을 비즈니스 로직으로부터 분리하기 위해 다이내믹 프록시를 도입해보았고, 이러한 다이내믹 프록시를 스프링 빈으로 등록해서 사용하기 위해 팩토리 빈 방식을 사용해보았다. 하지만 이러한 프록시 팩토리 빈 방식은 부가 기능을 담당하는 InvocationHandler를 구현한 오브젝트가 프록시 팩토리 빈의 개수(부가 기능을 사용하는 빈의 개수)만큼 만들어진다는 문제점과 여러 개의 클래스에 부가 기능을 적용해야 한다면 프록시 팩토리 빈을 생성하는 설정 코드가 중복되는 것을 막을 수 없다는 문제점이 존재하였다. 이번 포스트에서는 앞서 언급한 문제점들을 조금 더 살펴본 뒤, AOP와 빈 후처리기를 이용하여 해당 문제점들을 해결해보도록 ..