전체 글

머리를 쓰자
1. JPA 인터페이스를 사용해 Repository 구현중.. @Repository public interface ArticleRepository extends JpaRepository { Slice findAllByOrderByArticleIdDesc(Pageable page); //findAllOrderByArticleIdDesc 에러남 } 처음에는 findAllOrderByArticleIdDesc라고 짰는데 아래와 같은 에러가 났다. Reason: Failed to create query for method public abstract org.springframework.data.domain.Slice com.example.kingcar_be.Repository.ArticleRepository.fi..
졸업 프로젝트로 진행하고 있는 Tori는 공유 플랫폼이어서 팔로우/팔로잉(Tori에서는 친구맺기/친구끊기) 기능을 구현해야 했다. 🎈 Tori의 친구맺기/친구끊기 기능 개요 친구맺기/친구끊기 기능을 다음과 같이 요약해보았다. 👥 친구 맺기 🤝 A 사용자(cat)이 B 사용자(lion) 프로필에서 '친구맺기' 버튼을 누르면, ✔️ 버튼은 '친구끊기'으로 변한다. ✔️ B 사용자의 팔로워 수가 하나 증가한다. ✔️ A 사용자의 팔로잉 수가 하나 증가한다. ✔️ B 사용자의 팔로워 리스트에 A가 추가된다. ✔️ A 사용자의 팔로잉 리스트에 B가 추가된다. 👥 친구 끊기 친구 맺기의 반대 🎈 구현 방법 크게 두 가지 방법을 생각할 수 있다. 1️⃣ User 엔티티 안에 FollowerList와 Following..
Be My Story에는 친구들과 다른 유저의 컨텐츠를 모아 볼 수 있는 타임라인이 존재한다. Be My Story는 SNS이기 때문에 무한 스크롤이 어울리겠다고 생각했다. 큰 Result Set을 JPA로 처리하는 방법은 크게 Slice, Page, Stream 3가지로 나누어볼 수 있다. Slice와 Page가 paginated query를 사용하는 방식으로 모든 entity들을 작은 batch로 나누어, 메모리에 많은 데이터를 로드하는 것을 막는다. 나는 Slice를 이용해서 무한 페이지네이션을 구현해보았다. Entity Book entity를 data로 사용한다. @Entity public class Book { @Id @GeneratedValue(strategy = GenerationType.I..
· 알고리즘
순열 next_permutation 함수는 header에 정의된 함수로, [first, last)를 다음(next) 순열로 치환한다. (last는 범위에 포함되지 않음.) 다음 순열, 즉 "next permutation"이 존재하면 true를 반환하고, 아니면 첫 번째 순열로 바꾸어 false를 반환한다. 이러한 성질 때문에, 주로 do while문과 함께 쓰이며, 모든 순열을 탐색하고 싶다면 next_permutation에 배열을 넣기 전에 오름차순으로 정렬을 해야 한다. 예를 들어, int arr[4]={3,2,4,5};라는 배열이 있다고 하자. do{ for(int i=0;i
Be My Story의 동화 생성/수정/저장 로직은 다음과 같다. 동화 수정 요청에서 api 설계를 PATCH로 할지, PUT으로 할지 고민되었다. 그래서 HTTP RFC(Request For Comments)를 찾아보았다. 먼저 PUT부터 살펴보자. The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If..
첫번째로 확인할 것은 본인의 EC2 인스턴스 인바운드 규칙이다. 실제로 앞으로 나올 모든 과정이 정상적으로 진행되었음에도 https로 도메인이 들어가지지 않아서 일주일 넘게 고민했는데, 알고보니 ec2 인스턴스의 443포트를 열어주지 않아서 그 고생을 했었다. 두번째로, 도메인을 구입해야 한다. 나는 가비아에서 bemystory.store라는 도메인을 구매했다. .com이나 .kr로 끝나는 도메인은 비싼 편이니, 개발 공부 목적의 구입이라면 싼 도메인을 구입하는 것을 추천한다. 웹을 넘어 클라우드로. 가비아 그룹웨어부터 멀티클라우드까지 하나의 클라우드 허브 www.gabia.com 아래 링크에서 구매한 도메인을 어떻게 등록하는지 알 수 있다. https://customer.gabia.com/manual/..
프로젝트를 진행할수록 초반 설계의 중요성을 뼈저리게 느끼고 있다. (그리고 좋은 설계를 위해서는 많은 경험이 필요하다는 것도.) 현재 우리 러블리한 Be My Story의 가장 중요한 기능은 일기 데이터를 이용한 동화책 생성 및 수정인데, '생성' 단계까지 구현을 완료했고, 생성형 AI를 통해 만들어진 최초 동화책을 사용자가 '수정'(각색)하는 기능에 대한 회의를 진행하고 있었다. 어라 그런데 수정 기능 로직이 뭔가 이상하다. 우선 현재 동화책 생성 과정부터 짚고 가자. 1단계 유저가 일기 작성 →백엔드에게 일기 저장 및 동화텍스트 생성 요청 →백엔드(spring)에서 일기저장 → AI서버(ChatGPT, Fastapi)에게 동화텍스트 생성 요청 →스프링에서 AI서버에게 텍스트 받고 DB에 저장 후 클라..
[SpringBoot] 팔로워, 팔로잉 기능 구현하기 1 제일 복잡할 것 같아서 미루고 미루었던 팔로워, 팔로잉 기능 구현을 시작했다. 구체적인 기능은 인스타그램을 많이 참고하였다. 기능설명 A 사용자가 B 사용자 프로필에서 '팔로우' 버튼을 누르 z1-colab.tistory.com 1편에서 이어집니다. 2편은 구체적인 기능 구현입니다. Follow Controller *from_user: 팔로우를 요청하는 유저 *to_user: 팔로우를 요청받은 유저 팔로우 걸기, 팔로잉/팔로워 목록 조회, 팔로우 취소 기능을 구현했다. @RestController @RequiredArgsConstructor public class FollowController { private final UserService us..
mu_
Code Lab