시작개발 프로젝트를 진행하면 기능을 개발하는 것이 전부가 아니라는 것을 아실 겁니다. 성능, 신뢰성, 보안 등 다양한 비기능 요구사항 역시 충족시켜야 하죠. 저 역시 프로젝트에서 만든 기능에 대한 성능을 점검하고, 개선할 수 있는 부분은 능력이 닿는 한 향상하려고 노력합니다. 저는 가장 먼저 하는 작업으로는 조회 API에 대해서 성능 테스트를 진행하고, 캐싱이 가능한 부분은 캐싱을 도입해서 성능 개선을 하려고 하는 편입니다. 이 글은 제가 성능 테스트와 캐싱을 적용하는 과정에서 겪었던 시행착오에 대해서 다룹니다. 이미 내용을 아는 분들은 웃으면서 읽어주시고, 알지 못했던 분들은 저와 같은 실수를 하지 않으시길 바랍니다. 발단 블로그 소재가 없나.. 하면서 `velog`를 구경하는 와중에 이런 글을 읽었..
분류 전체보기
개요프로젝트를 진행하면서, 개발자는 로그를 남기게 됩니다. 로그를 남기는 이유는 다양합니다. 저 같은 경우엔 주로 값이 잘 넘어갔는지, 값이 다시 잘 왔는지, 오류가 났는지, 오류가 났다면 어디서 났는지... 등의 이유로 로그를 남기곤 했습니다.꼼꼼하게 로그를 남긴다면 오류가 발생했을 때 빠르게 원인파악이 가능해서 대응에 도움이 될 것입니다. 추가로 사용자들이 어떻게 서비스를 이용하는지에 대한 데이터를 확보할 수 있을 겁니다. 이처럼 중요한 정보를 담고 있는 로그를 저는 지금까지 별 생각없이 매번 Spring이 해주는 기본 설정으로 로그를 사용했었는데요, 기본 설정을 벗어나, 로그 라이브러리를 제대로 사용하는 방법을 공부해야 할 필요성을 느꼈습니다. Spring Boot에서 기본으로 사용한다는 `Logb..
개요Java, Spring으로 백엔드를 구성하면 데이터베이스를 다룰 일이 있을 것입니다.저의 주변에선 주로 JPA나 Mybatis를 이용해서 데이터를 다루는 것을 확인했습니다.저 역시 일반적으로는 JPA와 QueryDSL과 같은 기술들을 이용하지만 특정 상황에서 성능이 너무 떨어진다면 JdbcTemplate이나 Mybatis를 고려하게 되는 일들이 있었습니다. 이번 포스팅에서는 이처럼 다양한 DB 접근 방법 중 insert를 하는 방법에 대해서 알아보고, 각 방법의 성능을 비교해 보도록 하겠습니다. Insert를 하는 다양한 방법 기본적으로 Java에서 DB에 접근하기 위해선 JDBC를 이용해야 합니다. 하지만 직접 JDBC를 이용해서 DB를 조작하는 것은 여러 반복 코드가 발생하고, 커넥션 관리 등 신..
이전 상황 정리 이전 글은 Data JPA를 사용해서 Delete를 진행했을 때, N+1이 발생해서, 성능 저하가 발생했었고, `delete where in ...` 쿼리를 직접 작성하는 것으로 엄청난 성능 향상을 가져왔었다. 이젠 이 쿼리를 프로젝트에 적용하고 성능을 체크해보자. 적용 프로젝트에 적용하기에 앞서, 다시 한번 관계를 확인하겠습니다. Feed를 삭제하면 다음과 같은 관계를 갖습니다. 삭제 성능을 확인하기 위해, 테스트 데이터를 집어넣고 삭제를 진행해보자. 테스트 코드가 상당히 길어서 대충 정리하면 Feed는 10개, Comment는 각 Feed당 100개, Reply는 각 Comment당 100개, ReplyLike는 각 Reply당 10개씩 있어서, ReplyLike가 총 100만개정도 ..
웹 백엔드 프로젝트를 진행하면, 많은 분들이 `Java`언어와 `Spring Boot` + `JPA` 혹은 `MyBatis` 조합을 사용해서 개발을 진행합니다. 저 역시 지금껏 Spring Boot를 활용해서 개발을 했었고, `JPA`와 `MyBatis` 모두 사용해 보았지만, 최근엔 `JPA`를 주로 사용하며 개발을 했습니다. `JPA`를 선택하면, 많은 편의성이 있지만, 가장 와닿는 점은 쿼리를 직접 작성하지 않아도 된다는 점이라고 생각합니다. 하지만 `JPA`가 직접 작성해 주는 쿼리는 저희의 생각과는 다르게 동작하는 경우도 존재합니다. 이 글은 `JPA`의 Delete 쿼리를 사용하면서 발견한 의아한 부분을 발견하고, 더 효율적인 방법을 찾아보려고 했던 내용에 대해서 다룹니다. 배경 최근 한 프로..
❓ 사전 배경 - 왜 이런 방법들이 생겼는가? 우리가 사용하는 웹 서비스에서 통신하는 프로토콜인 HTTP는 무상태성을 특징으로 갖는다. 즉, 내가 서버와 10번, 100번을 통신했더라도, 101번째 통신에서조차 서버는 나인지 모르고, 다시 내가 누구인지 밝혀야 하는 상황이라는 것이다. 이 상황은 이용자가 굉장히 불편하게 만든다. 내가 네이버로 메일을 보내려고 하는데, 메일함 누르는 순간, 메일 작성 버튼을 누르는 순간, 등등 매번 로그인을 하라고 한다면 귀찮지 않겠는가? (사실, 로그인을 했다고 해도, 로그인은 안 될 것이다) 이런 문제를 해결하기 위해, 다들 들어봤을 법한 쿠키, 세션, 토큰과 같은 방법으로 서버에게 사용자에 대한 정보를 지속적으로 준다. 사용자가 어떤 사용자인지, 사용자가 이 기능에 ..
'JPA의 N+1 문제'라는 이야기는 JPA를 사용하는 사람이라면 반드시 들어봤을 문제이다. N+1 문제로 인해서 성능 문제도 발생한다고 하기 때문에, JPA를 사용하는데 성능이 떨어진다면, N+1 문제가 발생하지 않은지 항상 확인해야 한다고들 말한다. 면접에서도 자주 묻는다는 N+1 문제가 도대체 무엇인지, 왜 발생하는지, 어떤 영향을 주고, 어떻게 해결하는지에 대해서 알아보자. N+1 문제란? N+1 문제는 하나의 엔티티를 조회할 때, 해당 엔티티와 연관된 엔티티에 접근할 때, 지연 로딩 전략에 따라서 추가적인 쿼리가 N번(처음 조회된 엔티티의 개수)만큼 나가는 것을 의미한다. 예시 코드를 보며 이해를 해보자. public class Team { @Id @GeneratedValue private Lo..
0. 서론 앞선 글에서 자바의 날짜/시간과 관련된 클래스들에 대해서 알아보았습니다. 이번 글에선 JPA를 이용해서 자바의 클래스들이 MySQL에서 어떤 타입으로 변경 되는지를 알아보고, MySQL에 있는 데이터 타입에 대해서 정리하겠습니다. 💡목표 1. Java의 날짜/시간 클래스가 어떻게 변경되는지 확인한다. 2. DB에 있는 날짜/시간 데이터 타입에 대한 특징을 이해한다. 1. Java의 클래스는 어떻게 바뀌는가? 이번 시간엔 지금까지 알아본 Java의 다양한 날짜/시간 클래스들이 JPA를 통해 기본적으로 어떻게 변환이 되는지, 어떤 타입으로 변경이 가능한지에 대해서 알아보겠습니다. 아래 코드는 예제로 사용할 코드입니다. 앞선 포스팅에서 다룬 클래스인 `LocalDate`, `LocalTime`, `..