프로젝트/Trend-Pick
-
join fetch와 left join fetch의 차이프로젝트/Trend-Pick 2023. 9. 18. 22:11
쿼리를 최적화할 때 join fetch를 사용해서 최적화했다. 배포를 완료하고 테스트 하는데 계속해서 내가 올린 사진, 게시글들이 마이페이지에 올라오지 않는 문제점이 발생했다. 이 문제로 거의 일주일동안 고민했다. 내가 고친 것이라고는 fetch join으로 성능 최적화를 한 것밖에 없는데.. 중간에 네트워크에서 오류가 생겼나? 데이터에 에러가 나고있나? 라는 생각들이 들었다. 결국 처음으로 돌아와서 repository 계층에 있는 쿼리문에서 하나하나 조건을 빼가며 테스트를 해보았다. public List MyPagePicture(Long memberId) { return em.createQuery("select p from Picture p join fetch p.likes l " + "where p...
-
fetch join으로 성능 최적화프로젝트/Trend-Pick 2023. 8. 16. 15:41
프로젝트를 시작했을 때에는 JPQL를 간단히만 사용할 수 있었기 때문에 성능 문제에 대해서는 크게 고려를 안하고 값만 받아오는 데에 신경을 썼다. public List findAllPost() { List AllPost = em.createQuery("select p from Post p", Post.class) .getResultList(); return AllPost; } 예를 들어 post를 전부 가져오는 findAllPost()이다. 하지만 컨트롤러에서 post의 member에 접근해서 조회해야하는 상황이 있다. @GetMapping("/post_list") public List postList() { List findPosts = postService.findAllPost(); List post..
-
AWS S3를 이용한 사진 저장프로젝트/Trend-Pick 2023. 7. 31. 19:00
AWS의 S3를 이용해서 S3 버킷을 생성했다. 프리티어를 이용하면 20000개의 GET 요청과 2000개의 PUT, POST 요청이 월별 무료라고 한다. 기본 설정 build.gradle에 추가 implementation 'org.springframework.cloud:spring-cloud-starter-aws' application.properties에 추가 cloud.aws.credentials.accessKey='엑세스 키' cloud.aws.credentials.secretKey='엑세스 비밀 키' cloud.aws.s3.bucket=trendpick-photo cloud.aws.region.static=ap-northeast-2 cloud.aws.stack.auto=false S3 Confi..
-
자바 코드로 정렬 vs db에서 특정 값을 정렬해서 select프로젝트/Trend-Pick 2023. 7. 28. 22:30
사진 랭킹을 보여주는 페이지를 만들 때 dto로 사진 과 사진의 좋아요 개수를 넘겨줘야한다. 처음에는 사진만 select 한 다음 service 계층에서 자바 코드로 로직을 구현했었다. 하지만 좋아요 개수가 아니라 시간에 따른 좋아요 개수로 정렬해야하기 때문에 정렬을 할 때 db와의 소통이 무조건 필요했다. 많은 시간을 들인 끝에야 쿼리로 데이터를 받아오는 것이 맞다고 판단해서 repository 계층에서 select를 할 때 사진과 함께 사진의 좋아요 수를 쿼리로 받아왔다. 주간 랭킹의 예시 public List weeklyLike() { LocalDateTime now = LocalDateTime.now(); LocalDateTime startOfWeek = now.with(DayOfWeek.MOND..
-
비어있을 수도 있는 객체의 조회 -> Optional 사용프로젝트/Trend-Pick 2023. 7. 27. 16:56
@GetMapping("/post/{postId}") // 게시글 하나 클릭해서 들어가는 것 public PostWithCommentDto createPost (@PathVariable ("postId") Long postId) { Post post = postService.findOne(postId); PostImg postImg = postImgService.findByPostId(postId); List commentList = commentService.post_comment(postId); List commentDtoContents = commentList.stream() .map(c -> new CommentDtoContent(c.getContent(), c.getComment_member()..
-
@RequestParam과 @RequestBody의 차이점프로젝트/Trend-Pick 2023. 7. 22. 17:42
@PostMapping("/create_post") // 글쓰기 페이지에서 저장을 누르는거 public CreatePostResponse savePost(@RequestParam CreatePostDto createPostDto) throws Exception { Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); Post post = new Post(member, createPostDto.getTitle, createPostDto.getContent, LocalDateTime.now()); Long postId = postService.savePost(post); if (imgInPost != null) { postImgS..
-
로그인 세션으로 자동 CRUD프로젝트/Trend-Pick 2023. 7. 12. 02:24
CRUD를 해야 할 상황에 로그인 된 아이디가 member로 들어가서 글을 쓰거나 사진을 올리거나 로직을 작성해야 했다. 이전에는 임의의 member를 만든 다음에 테스트를 진행해봤는데, 실제 컨트롤러에서는 세션에서 받아와서 글쓰기를 하면 그 회원이 자동으로 post.member로 데이터가 들어가야 한다. 이전 스프링 MVC 포스팅에서 로그인하는 게시글이 있는데, 그 게시글을 참고해서 로그인 기능을 구현했다. 로그인 기능의 일부(자세한 코드는 깃허브에 있는 코드 참조) @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class LoginService { private final MemberRepository memberRe..
-
연관관계 사이의 무한 호출프로젝트/Trend-Pick 2023. 7. 11. 22:52
댓글 리스트를 출력하려고 했는데 무한 루프를 돌면서 쿼리가 계속해서 나가는 오류가 나왔다. Post와 Comment 사이의 연관관계가 이렇게 맺어져있다. @OneToMany(mappedBy = "post", cascade = CascadeType.ALL) private List commentList = new ArrayList(); @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id") private Post post; @GetMapping("/post/{postId}") // 3번의 게시글 하나 클릭해서 들어가는 것 public PostWithCommentDto createPost(@PathVariable ("postId") Long post..