Search

59. 스프링부트 포토그램 스토리페이지 포토리스트 API 만들기

스토리 페이지

1. 포토 리스트 API 만들기

이 페이지를 작업할거다
이 페이지에 들고올 데이터는
-유저정보
-사진정보
-캡션
-좋아요
-댓글
갖고 올 데이터에 대한 쿼리를 먼저 짜보면은
현재 2번 유저는 1,3 유저를 팔로우 하고 있다.
그래서 타임라인에는 1,3 유저에 대한 데이터들이 뿌려져야 하기 때문에
in을 사용해 1,3 유저에 대한 사진들을 갖고 올 수 있다.
2번 유저가 팔로우하는 유저들을 갖고오는 쿼리를 짜게 되면 이 쿼리를 아까 in안에 넣어주면 된다
-- 2번 로그인시 : userd = 1 ,3 SELECT * FROM image WHERE userId IN (1,3); SELECT * FROM user; SELECT toUserId FROM Subscribe WHERE fromUserId = 2; -- 서브쿼리 SELECT * FROM image WHERE userId IN (SELECT toUserId FROM Subscribe WHERE fromUserId = 2);
SQL
복사
코스랑 러브로 로그인해서 1~2개 정도의 사진들을 등록해주자
그러면 아까 3유저가 등록한 사진들도 이제 나온다.
Image.java를 통해서 데이터 셋팅된 값들안에 User 오브젝트도 있는데
User 오브젝트안에 보면 또 그 해당 유저가 올린 이미지 데이터를 갖고온다.
User.java 안의 image
하지만 우린 Imaqe.java 안의 유저 정보가 필요한거지 그 유저가 올린 image 까진 필요가 없다.
(Image.java 에서 이미지를 들고올거라서)
Image.java 에서 @JsonIgnoreProperties({"images"}) 추가해준다
@JsonIgnoreProperties({"images"}) @JoinColumn(name = "userId") @ManyToOne private User user; // 1, 1
Java
복사
그러면 User가 들고 있는 images는 무시하고 갖고온다.
이제 만들어 준 새 쿼리를 추가해준다.
ImageRepository.java
@Query(value = "SELECT * FROM image WHERE userId IN (SELECT toUserId FROM Subscribe WHERE fromUserId = :principalId)", nativeQuery = true) List<Image> mStory(int principalId);
Java
복사
이 함수를 호출하는 컨트롤러를 생성해준다
api 폴더 안에 ImageApiController.java 생성
@RequiredArgsConstructor @RestController public class ImageApiController { private final ImageService imageService; @GetMapping("/api/image") public ResponseEntity<?> imageStory(){ return null; } }
Java
복사
ImageService.java 가서 함수 하나를 만들어준다
@Transactional(readOnly = true) // 영속성 컨텍스트 변경 감지를 해서, 더티체킹, flush(반영) public List<Image> 이미지스토리(int principalId) { List<Image> images = imageRepository.mStory(principalId); return images; }
Java
복사
이때 readOnly = true를 해주면 좋은게
보통은 영속성 컨텍스트 변경 감지를 해서 더티체킹을 하고 flush(반영)을 해주는데 오직 읽기전용이기 때문에
더티체킹 및 반영을 안한다.
ImageApiController.java에 이어서
@RequiredArgsConstructor @RestController public class ImageApiController { private final ImageService imageService; @GetMapping("/api/image") public ResponseEntity<?> imageStory(@AuthenticationPrincipal PrincipalDetails principalDetails){ List<Image> images = imageService.이미지스토리(principalDetails.getUser().getId()); return new ResponseEntity<>(new CMRespDto<>(1, "성공", images), HttpStatus.OK); } }
Java
복사
postman으로 cos 2번 유저로 로그인하고
{ "code": 1, "message": "성공", "data": [ { "id": 1, "caption": "", "postImageUrl": "59102dbc-3139-4080-b7c9-d7067363248f_metamong2.jpeg", "user": { "id": 1, "username": "ssar", "password": "$2a$10$8fuljPcUbHt/JTIo1hewgO09dEuPzrFEGGnWAUq6nb5i7BSrn8PtC", "name": "쌀", "website": "https://github.com/0ZeroZone0", "bio": "주니어 개발자", "email": "ssar@nate.com", "phone": "000000000", "gender": "", "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-05T22:13:16.367593" }, "createDate": "2023-09-05T22:13:34.228224" }, { "id": 2, "caption": "메타몽입니다2", "postImageUrl": "9196aae1-5dc9-458e-bc23-fece493195aa_metamong3.jpeg", "user": { "id": 1, "username": "ssar", "password": "$2a$10$8fuljPcUbHt/JTIo1hewgO09dEuPzrFEGGnWAUq6nb5i7BSrn8PtC", "name": "쌀", "website": "https://github.com/0ZeroZone0", "bio": "주니어 개발자", "email": "ssar@nate.com", "phone": "000000000", "gender": "", "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-05T22:13:16.367593" }, "createDate": "2023-09-05T22:13:41.908387" }, { "id": 3, "caption": "하이루", "postImageUrl": "7adaf4fa-9932-44ca-86bb-284cb7712321_metamong2.jpeg", "user": { "id": 1, "username": "ssar", "password": "$2a$10$8fuljPcUbHt/JTIo1hewgO09dEuPzrFEGGnWAUq6nb5i7BSrn8PtC", "name": "쌀", "website": "https://github.com/0ZeroZone0", "bio": "주니어 개발자", "email": "ssar@nate.com", "phone": "000000000", "gender": "", "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-05T22:13:16.367593" }, "createDate": "2023-09-06T21:09:09.750515" }, { "id": 4, "caption": "하이루", "postImageUrl": "440138e3-2332-4aca-9447-bf3b94e2d3a0_metamong2.jpeg", "user": { "id": 1, "username": "ssar", "password": "$2a$10$8fuljPcUbHt/JTIo1hewgO09dEuPzrFEGGnWAUq6nb5i7BSrn8PtC", "name": "쌀", "website": "https://github.com/0ZeroZone0", "bio": "주니어 개발자", "email": "ssar@nate.com", "phone": "000000000", "gender": "", "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-05T22:13:16.367593" }, "createDate": "2023-09-06T21:09:09.750569" }, { "id": 5, "caption": "하하하", "postImageUrl": "2ce86170-06b9-43d3-89e6-3fc9d9f42b71_metamong4.png", "user": { "id": 1, "username": "ssar", "password": "$2a$10$8fuljPcUbHt/JTIo1hewgO09dEuPzrFEGGnWAUq6nb5i7BSrn8PtC", "name": "쌀", "website": "https://github.com/0ZeroZone0", "bio": "주니어 개발자", "email": "ssar@nate.com", "phone": "000000000", "gender": "", "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-05T22:13:16.367593" }, "createDate": "2023-09-06T21:19:52.418257" }, { "id": 8, "caption": "포차코1", "postImageUrl": "cfbb2a77-7d8e-448c-9533-da80ea69931c_포차코1.jpeg", "user": { "id": 3, "username": "love", "password": "$2a$10$jg0DHDzk.LkVGZdcaJ26uO8aFa/QbSBd5tfF9/iWP8sMgEVHa2G6S", "name": "러브", "website": null, "bio": null, "email": "love@nate.com", "phone": null, "gender": null, "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-09T22:10:06.007228" }, "createDate": "2023-10-02T15:26:48.600959" }, { "id": 9, "caption": "포차코2", "postImageUrl": "06acf7d2-e24e-43fe-b964-6728f52dbebe_포차코2.jpeg", "user": { "id": 3, "username": "love", "password": "$2a$10$jg0DHDzk.LkVGZdcaJ26uO8aFa/QbSBd5tfF9/iWP8sMgEVHa2G6S", "name": "러브", "website": null, "bio": null, "email": "love@nate.com", "phone": null, "gender": null, "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-09T22:10:06.007228" }, "createDate": "2023-10-02T15:26:55.388731" }, { "id": 10, "caption": "포차코3", "postImageUrl": "c8e79fcf-ac6e-4553-8a1b-ad71e37c2c5a_포차코3.jpeg", "user": { "id": 3, "username": "love", "password": "$2a$10$jg0DHDzk.LkVGZdcaJ26uO8aFa/QbSBd5tfF9/iWP8sMgEVHa2G6S", "name": "러브", "website": null, "bio": null, "email": "love@nate.com", "phone": null, "gender": null, "profileImageUrl": null, "role": "ROLE_USER", "createDate": "2023-09-09T22:10:06.007228" }, "createDate": "2023-10-02T15:27:04.049478" } ] }
JSON
복사

*참고