TIL 22

Querydsl로 Update 쿼리 날렸는데 테스트에 실패하는 경우 - 영속성 컨텍스트와 관련하여

1. 들어가며 간단한 게시판 구현 프로젝트를 하고 있습니다. 이번 포스팅에서 다뤄볼 주제는 게시글에 대한 좋아요 카운트 업데이트에 대한 테스트코드를 작성할 때 제가 만난 에러에 관한 것입니다. 구글링을 이것저것 하다보니 (전 ChatGPT를 한 번도 써보지 않았습니다! 그렇게 좋다고 하던데..구글링이 익숙해서일까요 ㅎㅎ) 이것도 결국 영속성 컨텍스트와 관련한 이슈였습니다. 영속성 컨텍스트는 정말 JPA를 쓸 때 철저하게 알아야 하는 개념인 것 같습니다. 2. 사용된 코드 전체 코드는 제 깃허브에서 확인하실 수 있습니다. 이 포스팅에서는 사용한 코드만 보여드리도록 하겠습니다. [HeartRepositoryImpl] [테스트코드] 테스트코드는 통과된 최종적으로 완성된 상태의 코드입니다. 3. 어떤 이슈가 있..

TIL 2023.03.23

JPA - N+1 문제

JPA를 사용하다보면 꼭 등장하는 문제가 있습니다. 바로 N+1 문제인데요. N+1 문제는 성능과도 밀접한 연관이 있기 때문에 주의해야되는 문제입니다. 이번 포스팅에서는 N+1 문제에 대해 한 번 정리해보고자 합니다. N+1 문제란? N+1 문제를 간단하게 정리해보자면 원래 진짜 목적이 되는 쿼리를 날릴 때 외부효과의 성격으로 원치 않던 쿼리가 추가적으로 날아가는 것을 의미합니다. 다음은 예시 코드입니다. 이해를 위해 FetchType을 EAGER로 하였습니다. 실무에서는 EAGER 사용은 자제하고 LAZY로 사용하는 것이 좋습니다. 예제코드이기 때문에 Setter를 열어줬습니다. 실무에서는 Setter를 자제하는 것이 좋습니다. [Member Entity 코드] @Entity @Setter @Gette..

TIL 2023.02.27

Spring Security & JWT Tutorial

1. 들어가며 어떤 서비스가 됐든 회원가입, 로그인 기능은 필수라고 할 수 있을텐데요. 흔히 말하는 인증, 인가 개념이 이 때 사용되는데 이것을 하는 방법은 다양합니다. 그 중 Spring Security 를 사용하면 인증, 인가 뿐 아니라 다양한 보안 조치를 Spring으로 만든 애플리케이션에 적용할 수 있습니다. 개인적으로 Spring Security가 많이 어렵게 느껴지긴 했습니다. 설정할 것들도 많고 알아야 할 개념들도 많았기 때문입니다. 게다가 자료도 스프링 MVC, JPA에 비하여 너무 적었습니다 ㅠㅠ (스프링 시큐리티 제대로 강의를 찍으면 부자가 될 지도..! 실력자 분들 츄라이 츄라이) 이번 포스팅에서는 여전히 많이 부족하지만 Spring Security와 JWT를 사용하여 사용자 인증을 ..

TIL 2023.02.01

Spring Interceptor 알아보기

1. 들어가며 애플리케이션을 개발하다보면 인증을 해야되는 경우가 있습니다. 대표적으로 로그인이 있습니다. 로그인은 웬만한 애플리케이션에 들어가는 필수적인 기능이죠. 인증을 처리하는 방법에는 여러가지가 있습니다. 쿠키, 세션 등을 활용할 수도 있고 서블릿 필터 혹은 Spring Security를 사용할 수도 있습니다. 그러나 이번 포스팅에서는 Spring Interceptor 라는 것에 대해서 작성해보고자 합니다. 2. Spring Interceptor 란? 스프링 인터셉터란 디스패처 서블릿과 컨트롤러 사이에서 작동합니다. 이 말은 즉 스프링 컨테이너 환경 안에서 작동한다는 것을 의미합니다. 이름에서부터 알 수 있듯이 스프링 인터셉터는 Spring 환경에서 작동합니다. 스프링 인터셉터와 유사한 개념으로 서..

TIL 2023.01.26

Spring Rest Docs 커스터마이징하기

1. 들어가며 Spring Rest Docs를 세팅하고 테스트코드를 작성해서 기본적인 API 문서를 만드는데 성공했다면 이제 본인이 원하는대로 API 문서를 커스터마이징 해볼 시간입니다. 이번 포스팅에서는 Spring Rest Docs를 커스터마이징 하는 방법에 대해서 알아보겠습니다. 2. API 마다 별도의 스니펫 디렉토리 만들어주기 여러 개의 API를 만들고 이에 대한 문서화를 진행하고자 한다면 디렉토리를 구분해주는 것이 좋습니다. 이를 위해서는 테스트코드에서 조정이 필요합니다. document( ) 안에 들어가는 파라미터로 어떤 API인지에 대한 identifier를 써주는 것이 좋습니다. identifier에 넣은 이름대로 스니펫 디렉토리가 생성이 됩니다. 테스트코드에서 지정해준 identifie..

TIL 2023.01.25

Spring Rest Docs 세팅하기!

1. 들어가며 API를 만드는 것도 중요하지만 또 다른 중요한 것이 있습니다. 바로 API 문서를 만드는 것입니다. API를 만드는 목적 자체가 다른 누군가가 사용하기 위해서 만드는 것이기 때문에 API를 어떻게 사용하는지에 대한 API 문서를 만드는 것은 아주 중요한 일입니다. API를 만들기 위해서 사용하는 다양한 툴이 있습니다. 우리나라에서는 Swagger와 Spring Rest Docs를 많이 사용하는 것 같습니다. 각자 일장일단이 있기 때문에 무엇이 더 좋다라고 단정짓기는 어렵습니다. (다만 Spring Rest Docs 자체가 이름에서 Spring이 들어가는 것처럼 Spring 진영에서 좀 더 밀어주는 거 같기도...) Spring Rest Docs는 테스트코드를 작성함으로써 API 문서를 만..

TIL 2023.01.25

페이징 시 Limit과 Offset의 개념

페이징에 관련된 내용을 공부할 때 Limit과 Offset이 자주 등장했는데 정리를 해볼까 합니다. 특히 Offset 개념이 잘 이해가 되지 않아서 공부할 겸 정리를 하면 좋을 것 같습니다. 1. Limit 과 Offset 개념 Limit: 행을 얼마나 가져올지 -> 페이지 당 데이터를 몇 개를 가져올 지 Offset: 어디서부터 가져올지 -> Offset 다음 위치부터 Limit 수만큼 데이터를 가져옴 2. 예제 select 칼럼명 from 테이블명 limit 10 offset 0 이렇게 쿼리를 날리면 1~10까지 출력이 됩니다. limit으로 10을 걸어줬으니 한 페이지 당 데이터는 10개씩 가져오게 되는 것이고, offset 이 0이기 때문에 1부터 10개인 1~10이 출력이 되는 것이죠. 동일한 ..

TIL 2023.01.20

Junit5 테스트코드를 짤 때 주의할 점

1. 배경 테스트코드를 짤 때 주의할 점이라고 거창하게 말했지만 실제로는 제가 오늘 하루 삽질을 한 후기입니다. 결론부터 말하자면.. 주의!!! 테스트 코드의 실행순서는 보장되지 않는다..! 이것을 강의 들을 때 분명히 배웠음에도 기억을 하지 못 하여 엄한데서 삽질을 하였습니다. 2. 문제 상황 강의를 들으며 테스트코드를 작성하고 개별 테스트에서는 테스트통과가 되나 전체 테스트를 돌리면 특정 테스트만 실패함 우선 Controller 쪽 코드는 다음과 같습니다. 페이징과 관련된 코드인데 쿼리는 다음과 같습니다. 이 부분에 관한 테스트 코드는 다음과 같습니다. 여기서 오늘 하루종일 저를 괴롭혔던 부분은 테스트코드에서 id를 검증하는 부분이었습니다. test5를 단독실행하면 늘 항상 통과가 됐는데 전체 테스트..

TIL 2023.01.19

H2 데이터베이스 초기 세팅하는 법

인프런에서 김영한님 강의를 들으면서 H2 데이터베이스를 연결해야될 일이 많이 있었다. 그러다보니 새로운 강의를 들을 때 동일한 H2 DB로 계속해서 접속하게 되니까 이전에 만들어뒀던 테이블이 남아있어서 강의를 듣는데 살짝 방해가 됐다. 새로운 DB로 연결하려고 할 때마다 DB 파일을 만들고 JDBC URL을 작성하는 것이 헷갈렸다. 그래서 정리를 해보고자 한다. (H2 DB를 설치했다는 가정 하에 진행) 1. H2 DB 콘솔을 열어준다. 터미널에서 H2 DB를 실행해주면 바로 열리긴 하지만 혹시나 안 된다면 localhost:8082로 접속을 시도하면 된다. 2. JDBC URL 부분에 jdbc:h2:~/파일이름 을 적어주고 연결을 한 번 해준다. 3. 이후 접속부터는 JDBC URL에 jdbc:h2:t..

TIL 2022.12.14

JPA - Fetch Join

JPQL 에서 지원하는 join fetch 기능은 주로 DB에서 데이터를 조회할 때 필요했던 여러 개의 쿼리를 하나의 쿼리로 줄임으로써 쿼리 성능을 향상시킬 때 자주 사용한다. 실무에서 굉장히 자주 사용되는 기술이므로 제대로 알아두는 것이 중요하다. 1. 일반 조인과 페치 조인의 차이 일반 조인과 페치 조인의 가장 큰 차이를 꼽자면 연관된 엔티티를 함께 조회하는지의 여부일 것이다. 일반 조인: 연관된 엔티티를 함께 조회하지 않는다. 페치 조인: 연관된 엔티티를 함께 조회한다. [일반 조인 예시] // JPQL select t from Team t join t.members m where t.name = ‘팀A' // 실제 나가는 SQL SELECT T.* FROM TEAM T INNER JOIN MEMB..

TIL 2022.11.28