목록프로그래밍 (409)
쌓고 쌓다
똑같은 요청이라도 특정 조건에서는 권한 체크를 확인하는 로직을 구현하고자 한다. 작성한 코드는 다음과 같다. @GetMapping public ResponseEntity getLocations(@RequestParam("latitude") Double latitude, @RequestParam("longitude") Double longitude, @Valid @ModelAttribute LocationConditionRequest conditionRequest) throws PermissionException { Boolean approve = conditionRequest.getApprove(); if (!approve) { Authentication authentication = SecurityCo..
클라이언트는 회원가입시 이메일 인증 번호와 프로필 이미지를 서버로 전송한다. 이때 이메일 인증 번호가 일치할때 이메일 인증서를 찾아 삭제하고, 프로필 이미지 업로드 로직을 수행한다. 그런데 프로필 이미지 업로드 로직을 수행할때 업로드 용량의 제한이 있어서 예외가 발생할 수 있다. 이때 @Transactional을 통해 롤백을 수행하여 삭제한 이메일 인증서를 삭제하지 않고 다시 원래 상태로 DB에 두는 롤백을 원했다. 그러나 예외는 발생했지만 롤백은 되지 않는 문제가 발생했다. 문제의 코드는 다음과 같다. @Transactional public MemberResponse addMember(SignUpMember signUpMember, MultipartFile memberImg) throws Duplica..
여러 Controller를 작성하다가 내가 어떨땐 다음과 같이 Controller에서 DTO -> Entity 변환을 하여 Service단에 넘겨주는 코드를 작성하기도 하고, PosterController.java Poster poster = PosterRequest.toEntity(posterRequest); posterService.addPoster(poster, files, locationId, member); 내가 어떨땐 Controller에서 DTO를 그대로 넘기고 Serive단에서 DTO -> Entity 변환을 하는 코드를 작성하기도 한게 눈에 들어왔다. PosterService.java void addPoster(PosterRequest posterRequest) { Poster poste..
특정 게시글에 달린 댓글 개수와 좋아요 개수를 구하는 쿼리를 작성하고자 했다. 먼저 poster_id가 61인 게시글에 달린 댓글들을 보자. 댓글 id가 25, 26, 34번으로 3개의 댓글이 존재한다. 여기서 게시글과 댓글을 LEFT JOIN하여 결과를 보자. select * from poster LEFT JOIN comment ON poster.id = comment.poster_id; 게시글 정보와 댓글 정보가 붙어 출력된다. 그럼 게시글에 달린 댓글 개수를 세보자. select poster.id, COUNT(comment.id) from poster LEFT JOIN comment ON poster.id = comment.poster_id GROUP BY poster.id; 61번 게시글에 달린 ..
문제가 발생한 상황은 다음과 같다. 회원은 프로필 이미지를 하나만 가질 수 있는 상황이다. Member @Entity @Data public class Member { ... @OneToOne(mappedBy = "member", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private MemberImage memberImg; ... } MemberImage @Entity @Data @NoArgsConstructor public class MemberImage { ... @OneToOne @JoinColumn(name = "member_id") private Member member; } @OneToOne으로 회원과 프로필 이미지는 하나만 가지도록 했다..
기존의 회원 프로필 이미지를 DELETE 쿼리를 날려주려고 했으나.. 날아가지 않는다. member.setMemberImg(null)를 작성하기전에는 member에서 MemberImage를 참조하고 있어서 null로도 해주었지만 동작하지 않는다... member의 Name을 변경했지만 UPDATAE 쿼리는 나가지 않는다. member가 dirty checking이 동작하지 않는것인데 영속성 컨텍스트에 존재하지 않는다는 이유인것 같다. member를 다시 초기화하는 과정을 넣었더니. public String updateMember(MemberUpdateRequest memberUpdateRequest, MultipartFile memberImg, Member member) throws DuplicateEx..
구현하고자하는 기능은 다음과 같다. 1. 지도에 표시할 주위 장소들을 위한 요청 ( 페이징 X ) /locations?latitude=위도&longitude=경도 : 위도 경도로 주위의 정보를 페이징 처리하지 않고 한 페이지에 모두 출력 2. 게시글 목록을 위한 주위 장소들을 위한 요청 ( 정렬, 페이징 O ) /locations?latitude=위도&longitude=경도&search=내용 /locations?latitude=위도&longitude=경도&sort=like /locations?latitude=위도&longitude=경도&search=내용&sort=like 정렬과 검색을 따로 또는 함께 요청이 가능하며 페이징 처리된 응답을 받길 원한다. 이때 page와 size는 기본값으로 설정된다. 3...
MySQL로 좋아요 개수 쿼리를 공부하다가 Count의 인자로 뭘 넘겨주느냐의 차이를 정리하면 좋겠다싶어 정리한다. 먼저 장소(location)과 장소 좋아요(location_like)의 관계는 1:N이며 left join 했을때 결과는 다음과 같다. 왼쪽의 id가 장소의 PK인 id이고, 오른쪽의 id는 좋아요PK인 id이다. 장소 id 1에 좋아요 2개, 장소 id 2에 좋아요 1개, 장소 Id 3, 4에는 좋아요가 없는 상황이다. 이때 GROUP BY로 장소 id로 그룹을 묶고 count(*)를 해보자. 장소 3, 4에 좋아요가 없음에도 불구하고 1이 카운트된다. COUNT(Column)인 Count(location_like.id)를 해보자. ( 좋아요PK를 count ) 좋아요가 없는 장소는 0으..