1. 개요최근 아무생각없이 RDS를 퍼블릭으로 열어뒀다가 욕(?)을 먹고 수정한 과정에 대해 공유하고자 한다. 2. 퍼블릭 액세스 허용 여부블로그를 참고해 RDS를 만드신 분들은 대부분 퍼블릭 액세스를 허용했을 거라 생각이 든다. "RDS 퍼블릭 액세스" 라는 키워드로 구글링 해보면 다음과 블로그들이 많이 보인다. 예전에 나도 로컬 환경에서 RDS에 접근하려 하는데 접근이 막혔고 구글링해서 퍼블릭 액세스를 열어줬던 기억이 난다. 하지만 외부에서 DB에 접근 가능하도록 허용하는건 위험하다. EC2 인스턴스를 만들어서 RDS 사용할 것이라면 외부에서 접속할 수 없도록 하는 것이 더욱 안전한 방법이다. 퍼블릭 액세스를 막을 경우 외부에서 접근할 방법이 없지 않느냐? 할 수 있는데 이는 같은 VPC..
1. 개요프로젝트에서 다음과 같은 로직이 있다. 모집 공고에 모집 인원을 초과하지 않는다면 모집된 인원을 증가시켜 주고 있다. public synchronized void plusRegisteredNum(Integer updateCount) { if (this.registeredNum + updateCount > this.recruitNum) { throw new CustomException(ErrorCode.APPLY_OVER_RECRUIT_NUM); } this.registeredNum += updateCount;} 동시성 이슈를 방지하기 위해 synchronized 키워드를 넣어주었는데 테스트 코드를 작성해봤을 때 동시성 문제가 발생하고 있었다. 원인을 찾아봤더니 ..
1. 개요 벌써 동시성 관련 포스터만 4개째이다... 진행 중인 프로젝트에선 MySQL Lock을 걸어 동시성 이슈를 해결했었는데 다른 방법도 알게되어 소개하고자 한다. 단일 환경에선 DB에 비관적 락 등을 이용하여 동시성을 제어할 수 있지만, 여러 대의 DB가 존재하는 분산 DB 환경에서는 동시성 문제를 해결할 수 없다. 이때 분산 락을 활용해 동시성 문제를 해결한다. Redis는 분산락을 해결하기 위해 널리 사용되는 방법 중 하나이다. 2. 동시성 문제가 일어날 경우다음은 재고 엔티티가 있고 재고 감소를 하는 기능을 테스트하는 코드이다. - Entity@Entity@Getter@NoArgsConstructor@AllArgsConstructorpublic class Stock { ..
1. 개요문득 DB의 Member 테이블을 보던 중 너무 많은 Null 값이 존재하는 게 신경 쓰였다. 회원의 Role은 기업, 노동자로 나눠져있고 각 Role마다 갖는 필드가 다르기 때문에 @Embeddable로 관리하고 있었다. 그렇다 보니 기업은 노동자가 갖는 컬럼은 전부 null이고, 노동자는 기업이 갖는 컬럼은 전부 null이었다. 프로젝트에선 Spring Data JPA의 기본 구현체인 Hibernate를 사용하고 있는데, Hibernate 구현체에선 @Embedded 객체의 모든 필드의 값이 null이면 해당 객체 자체를 null로 설정하게 된다.따라서 해당 클래스를 사용하려고 할때 NullPointerException이 발생해버린다. 이를 해결하기 위해선 2가지 방법으로 해결할 수 있다...
1. 개요JPA를 사용할 때, 지연 로딩과 같은 기능을 무분별하게 사용하다보면 의도 하지 않은 수많은 쿼리가 나가는 경우가 많다. 흔히 이런 문제를 N+1 문제라고 한다. 이렇듯 ORM을 사용하다보면 예상치 못한 개수의 쿼리가 발생하기도 하는데, 이를 한눈에 파악하기는 쉽지 않다. 로그에 쿼리가 출력되긴 하지만 하나하나 세고 있자니 생산성이 너무 떨어진다. 방법이 없을까 찾아보다 쿼리 카운터에 대해 알게됐다. 대표적인, 또 쉽게 구현할 수 있는 방법은 Hibernate에서 쿼리문을 가로챌 수 있는 StatementInspector를 사용하는 것이다. 다른 방법으론 Spring AOP를 활용하는 것이다. 두 가지 방법을 하나하나 알아보려 한다. 결론부터 얘기하자면 나는 Spring AOP를 활용한 ..
1. 개요여러 리펙토링을 거치면서 성능 개선을 해나가던 중, 성능을 수치화할 필요성을 느꼈다. 성능 테스트, 부하 테스트, 스트레스 테스트는 시스템의 성능과 안정성을 평가하는 중요한 도구들이다. 각 테스트의 정의와 목적, 그리고 이를 통해 얻을 수 있는 이점에 대해 알아보고자 한다. 2. 성능 테스트 (Performance Test)성능 테스트는 특정 상황에서 시스템의 구성 요소가 어떻게 수행되는지 확인하기 위해 수행되는 테스트이다. 성능 테스트를 통해 시스템의 자원의 사용량, 확장성, 신뢰성 등을 검증할 수 있다. 일반적으로 개발을 하면서 부하 테스트와 스트레스 테스트 등의 키워드를 많이 접해봤을 것이다. 아래의 사진을 보면 해당 테스트들은 모두 성능 테스트 하위에 있는 것을 알 수 있다. 그만..