스토리 페이지
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
복사