SpringBoot37 [Spring] 무한 스크롤에서 Page vs Slice의 차이(feat. Slice 구현 코드) 프로젝트에서 내가 맡은 기능 이슈에서 게시글 목록 전체 조회 시 무한 스크롤 구현이 있었다. 작년에 프론트로 개발을 처음 시작했었을 때 무한 스크롤의 경우 백엔드에서 전체 데이터를 다 주면 안드로이드에서 recyclerView를 이용해서 무한스크롤을 구현했었는데 올해부터 백엔드 개발을 시작한 이래로 2월에 기본기를 다지기 위해 다른 프로젝트에서 CRUD를 맡다가 지금은 백엔드 입장이 되어서 백엔드 단에서 이 기능을 맡게 되어 감회가 새롭다. 백엔드로서 처음 맡는 기능인 만큼 단계적으로 진행하고자 무한 스크롤 없이 200OK가 응답되도록 전체적인 게시글 GET 요청에 대한 코드 설계는 완료를 해서 feature/#189 (이슈 번호) 브랜치에 push를 해둔 상황이고(엔티티 3개를 거쳐야 해서 구현이 재밌.. 2024. 5. 18. [Spring] JPA 일대다 양방향 관계 주의할 점: MappedBy와 연관 관계 주인 bookStore과 book가 일대다 양방향 연관 관계를 맺고 있는 상황을 생각해보자. entity 코드는 아래와 같다.(entity에 @setter는 일반적으로 쓰지 않는 것이 좋지만 JPA 일대다 양방향 연관 관계 맵핑 시 주의할 점을 설명하기 위해 선언하였다.)@Entity@Getter @Setterpublic class BookStore { @Id @GenerateValue private Integer id; private String name; @OneToMany(mappedBy = "bookStore") private Set books = new HashSet(); public void add(Book book) { this.books.a.. 2024. 5. 13. [Spring] 성능 개선을 위해 Querydsl을 어떻게 활용해야 할까 query dsl을 이 pr 링크에서 처음 시도해보았으나 기존에 내가 계속 리펙토링 하던 로직보다 성능이 나아지지 못하여서 보다 활용 원리를 더 공부하고 다른 플젝에 이슈를 생성하여 적용하고자 해당 게시글을 작성하게 되었다. 어렵지만 공부하고 적용해서 계속 추가할 예정이다. 제목 그대로 성능 개선을 위해 Querydsl을 어떻게 활용해야 할까? extends / implements 사용하지 않기일반적으로 repository를 만들면 spring data jpa 기능을 이용하기 위해 jpa repository를 extends로 상속 받고, query dsl에서도 custom repository를 만든 뒤 상속 받으며 이를 구현한 구현 객체가 필요하다. 혹은 query dsl의 경우 QuerydslRepos.. 2024. 5. 13. [Spring] @EnableJpaAuditing과 createdAt의 연결고리 진행 중인 프로젝트에서 특정 엔티티에 post api 요청을 통해 request dto의 내용이 튜플로 추가되어야하는 시간이 DB에 함께 저장되어야 하는 기능을 구현해야 했다. (updated_at도 기본적으로 있으면 좋으나 이 프로젝트에서는 created_at만 필요했다)이 과정에서 헤맨 부분과 어떻게 해결했는지에 대해 남기려고 한다. 코드는 이 PR 링크에서 확인할 수 있다. 문제 상황 : 'createdAt' cannot be null분명히! 아래와 같이 created_at에 대해 column을 정의하고 package com.whoa.whoaserver.global.common;import jakarta.persistence.Column;import jakarta.persistence.EntityL.. 2024. 5. 8. [Spring] N+1 문제를 해결하여 조회 쿼리 성능을 높여보자 이전에는 내가 이 기능을 구현을 할 수 있느냐 없느냐가 관건이었지만 이제는 능력있는 백엔드 개발자가 되기 위해 어떻게 하면 더 잘 짤 수 있을까를 고민하게 되면서 성능 최적화에 관심을 가지게 되었다. 일차적으로 기능 구현에 초점을 두고 배포 이후 리펙토링을 하는 단계로 작업을 하고 있는데 N+1 문제를 맞닥뜨리게 되면서 조회쿼리의 실행 시간을 단축시키거나 쿼리 수를 줄이는 성능 향상 과정에 대해 작성하고자 한다. 진행 중인 프로젝트에서 1차 MVP 기능 구현은 모두 완료했고 프론트분들께서 기능 구현을 하시는 단계인데 구현이 끝났다고 해서 손을 떼버리면 항상 배움의 자세를 갖춰야 하는 개발자의 자질에 어긋난다고 생각되어 내 나름대로 리팩토링 시간을 가지고 있다. 이 PR 링크에서는 내가 맡은 기능에 대해 .. 2024. 5. 4. [Spring] kotlin + security + jwt 구현 과정 트러블 슈팅 백엔드 실제 개발을 처음 시작한 2024년 1월 경 spring security부터 맡게 되어서 허덕인 부분이 많았는데 그 당시 깊이있게 보지 못했던 원리에 대해서 공부(정리한 이슈 링크)하고 security 부분을 보완하고자 나의 첫 번째 개발 언어였던 애틋한ㅋㅋ kotlin으로 다시 구현해보려고 하였다. 소스 코드와 구현 과정 중 어떤 부분에서 오류가 났고 어떻게 코드를 설계했는지에 대해 배운 점을 기록하고자 한다. Security가 작동하고 있다면 SecurityConfig의 permitAll을 통해 401을 예방하자윗 문장은 내가 kotlin으로 구현한 spring security 적용 회원가입, 로그인 + jwt 과정에서 얻은 배운 점이다. 아래에서 깃헙 이슈 링크에서 적었던 절차에서 확인할 .. 2024. 4. 28. [Spring] 선착순 티켓 예매 동시성과 잠금 여부 고민 티켓 예매 상황에서 고려해야 할 사항은 크게 두 가지가 있다. - 요청 순서에 따라 티켓을 발급할 수 있는가- 준비된 수량만큼 발급할 수 있는가 엔티티에 락을 걸지 않고 동시성 문제를 해결할 수 있는 방법으로는 무엇이 있을지 실습을 통해 고민해보았다.싱글 스레드 모델을 적용하거나 메세지큐를 사용하지 않고 불변성을 이용하여 순서를 먼저 확정함으로써 특정 순서 이전의 티켓을 발급할 수 있도록 로직으로 설계한다면 잠금 없이 기존 환경 그대로 선착순 티켓 예매가 가능할 것이라는 생각이 들었다. 마치 은행에 가면 대기 번호표를 뽑듯이 티켓 발급 요청이 들어왔을 때 티켓을 순서대로 발급하고 정해진 수량만큼만 발행을 한다면 불변성을 이용해서 잠금 없이 동시성 처리가 가능하다. 아래는 소스 코드를 어떻게 설계했는지에.. 2024. 4. 16. 이전 1 2 3 다음