All

Spring

스프링부트 + Redis를 활용한 최근 검색어/인기 검색어 구현

저번 전문가를 매칭시켜주는 숨고 서비스를 클론 코딩하는 팀 프로젝트를 진행하던 중 인기 검색어, 최근 검색어를 구현하는 파트를 맡게 되었다! 오늘은 그와 관련해서 포스팅을 해보려고 한다. 최근 검색어, 인기 검색어... 왜 Redis를? 우선 RDB가 아닌 NoSQL의 Redis를 선택하게된 이유에 대해서 간략하게 생각해보자. 우리가 일반적인 사이트의 검색창에 마우스를 클릭했을 때 최근 검색한 내용, 혹은 그 서비스에서 제공하는 인기 검색어의 리스트등이 나오는 것을 볼 수 있다. 여기서 '검색어를 입력하지 않았을 때도 데이터를 제공해주고, 실제로 잘못 클릭했을 경우에도 저 데이터를 제공해주네..?' 라는 생각을 해서 의도했던, 하지 않았던 해당 서비스에서 많은 사용이 이루어질 것이라고 판단했다. 그말은 ..

트러블 슈팅

AOP를 적용한 메서드의 파라미터 내용을 가져올 시에 파라미터 이름이 arg0 등으로 인식될 때

데브코스에서 팀플을 진행중에 로그인한 사용자들을 확인후 id를 가져오는 AOP를 만들었다. 그 중 일부 내용을 발췌한 것 인데, 대략적으로 아래 코드와 함께 요약하면 로그인을 한 상태에서 로그인한 사용자의 ID가 필요한 메서드에 @CurrentMemberId를 붙이면 해당 메서드의 파라미터들의 값들을 불러와 memberId가 있으면 로그인한 사용자의 memberId로 매핑해 주는 것이다. 다시 AOP 코드로 가서, 여기서 봐야할 것은 parameterName 인데 이 AOP를 적용한 팀원분의 로컬에서는 해당 메서드들의 파라미터들의 갯수만큼 for문을 돌며 각 파라미터의 값들이 잘 불러와졌다. (ex memberId 등) 하지만 내 로컬에서는 되지 않아, 콘솔로 찍어보니 맨 아래의 parameterName..

JPA

Spring Data JPA에서 Fetch Join과 CountQuery를 사용한 페이징 최적화

서론 N+1 문제란 Spring Data JPA를 사용하다보면 N+1 문제에 대해서 많이들 겪곤 한다. N+1 문제란 관계형 데이터베이스에서 일반적으로 발생하는 성능 이슈다. 예를 들어, 게시물(Post)과 사용자(User) 그리고 댓글(Comment)이라는 엔티티가 있다고 가정해 보자. 게시물 목록을 가져올 때, 각 게시물에 대한 사용자 정보와 댓글 정보를 함께 가져와야 하는 경우 N+1 문제가 발생할 수 있다. Fetch Join 이러한 문제를 해결하기 위해 Fetch Join을 사용하여 연관된 엔티티를 한 번의 쿼리로 함께 로드할 수 있다. 즉 Fetch Join은 관계형 데이터베이스에서 조인을 통해 필요한 데이터를 한 번에 가져오는 방식이다. Fetch Join 사용 X - 연관된 테이블에 등록..

Spring

Spring Boot에서 RestController 테스트시 @WebMvcTest 사용하기 (feat. 실패 테스트까지!)

프로그래머스 데브코스 백엔드 4기 코스에서 과제를 수행하던 중, RestController의 테스트 코드를 짜게 되었다. 일련의 시행착오도 거치고, 잘못된 지식도 있었다. 그리고 세상에서 제일 잔인한게 '아.. 이거 해본거 같은데 기억이 안나네..' 이다.. 기억이 휘발되어 이러한 반복을 방지하기 위해 글로 남긴다! 목차 1. 스프링에서 RestController 테스트시 주로 사용되는 어노테이션 2. 나는 어떤걸 썼느냐? 3. 리팩토링을 하며 거쳤던 시행착오 (feat. 예외에 대한 테스트) 4. @WebMvcTest 사용시, 간단한 테스트의 사용법 5. 다섯 줄 요약 들어가기 앞서, 스프링에서 RestController 테스트시 주로 사용되는 어노테이션 1. @WebMvcTest 목적 : 스프링 MV..

도서/정리

[이펙티브 자바] 아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라

아이템21. 인터페이스는 구현하는 쪽을 생각해 설계하라 자바 8 디폴트 메서드 (Default Method) 자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성은 아주 낮기 때문이다. 자바 8에 와서 기존 인터페이스에 메서드를 추가할 수 있도록 디폴트 메서드가 생겼다. 디폴트 메서드의 문제점 디폴트 메서드를 선언하면, 그 인터페이스를 구현한 후 디폴트 메서드를재정의하지 않은 모슨 클래스에서 디폴트 구현이 쓰이게 됨으로, 모든 기존 구현체들과 연동되지 않을 수 있는 문제가 발생한다. 자바 8부터는 주로 람다를 활용하기 위해서 다수의 디폴트 메서드가 추..

도서/정리

[이펙티브 자바] 아이템20. 추상 클래스보다는 인터페이스를 우선하라

아이템20. 추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지다. 추상 클래스 vs 인터페이스 자바 8부터는 인터페이스도 디폴트 메서드를 제공할 수 있게 되어, 두 방식 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 즉, 추상 클래스는 좀 더 상세한 구현과 필드를 가질 수 있지만, 인터페이스와 달리 다중 상속은 불가능 하다는 점이다. 비슷한 역할을 하는듯 하지만, 인터페이스는 추상 클래스에 비해 다양한 장점이 있다. 기존 클래스에 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. 인터페이스는 믹스인(mi..

도서/정리

[이펙티브 자바] 아이템17. 변경 가능성을 최소화하라

아이템17. 변경 가능성을 최소화하라 불변 불변 불변!! 불변 클래스 한 줄 요약 인스턴스 내부 값을 수정할 수 없는 클래스를 말한다. 불변 클래스는 생성될 때 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 불변 클래스의 장점 가변 클래스보다 설계하고 구현하고 사용하기 쉽다. 단순하기 때문이다. 상태가 가변한 인스턴스는, 동일한 인스턴스를 활용하는 곳이 많아질수록 오류의 가능성이 늘어난다. 내가 사용하려던 인스턴스의 상태와 동일한지 확인을 하지 않는다면, 원하는 동작을 보장받을 수 없다. 불변 객체는 근본적으로 Thread Safe 하며 따로 동기화할 필요 ..

도서/정리

[이펙티브 자바] 아이템16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

아이템16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 종종 인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스를 작성하려 할 때가 있다. 퇴보한 클래스는 public이어서는 안된다. class Point { public double x; public double y; } Point 클래스의 x, y 값은 아무곳에서나 접근 가능하고 그 결과 x, y에 대한 관리 책임은 Point가 가지고있지 않는다. 이런 클래스의 단점은 아래와 같다. 데이터 필드에 직접 접근할 수 있어 캡슐화의 이점을 제공하지 못한다. API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없고 외부에서 필드에 접근할 때 부수 작업을 수행할 수도 없다. 철저한 객체 지..

맹수호빵
'분류 전체보기' 카테고리의 글 목록 (3 Page)