URL : http://2netflix.s3-website.ap-northeast-2.amazonaws.com/
๋ทํ๋ฆญ์ค ํด๋ก ์ฝ๋ฉ
2022๋ 08์ 19์ผ ~ 2022๋ 8์ 25์ผ (1์ฃผ)
| ์ด๋ฆ | ๊นํ๋ธ ์ฃผ์ |
|---|---|
| ๋ฐ๋ฏผ์ค | https://github.com/pmjn1025 |
| ๋ฅ์ง์ฐ | https://github.com/ryujiwoo184 |
| ํ๋ํ | https://github.com/hdonghun |
์ฌ๊ธฐ๋ฅผ ๋๋ฌ์ฃผ์ธ์
์ฌ๊ธฐ๋ฅผ ๋๋ฌ์ฃผ์ธ์
โโโ ๐backend
โโโ member
| โโโ controller
| | โโโ MemberContorller
| โโโ domain
| | โโโ Member
| โโโ service
| | โโโ MemberService
| โโโ repository
| | โโโ MemberRespository
โโโ movie
| โโโ controller
| | โโโ MovieContorller
| โโโ domain
| | โโโ Movie
| โโโ service
| | โโโ MovieService
| โโโ repository
| | โโโ MovieRespository
...
-
๋ก๊ทธ์ธ, ํ์๊ฐ์
: JWT๋ฅผ ์ด์ฉํ์ฌ ๋ก๊ทธ์ธ๊ณผ ํ์๊ฐ์ ์ ๊ตฌํํ์์ต๋๋ค. : ์์ด๋์ ๋๋ค์์ ์ค๋ณตํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค. : OAuth 2.0์ ์ด์ฉํ์ฌ ์นด์นด์ค ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํฉ๋๋ค. -
CRUD
: ๊ฐ ์นดํ ๊ณ ๋ฆฌ๋ณ ์ํ/๋๋ผ๋ง์ ํ์ธ ํ ์ ์์ต๋๋ค. : ์ข์์ ๐ ๋ฐ ์ฐํ๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ ์์ต๋๋ค. -
API
: ์ํ ์คํAPI๋ฅผ ๊ฐ์ ธ์, ์ฌ์ฉํ์ฌ ๋ทํ๋ฆญ์ค ๋ฉ์ธ ํ์ด์ง์์ ๋ณด์ฌ์ฃผ๋ ๊ฑฐ ๊ฐ์, ์ํ,๋๋ผ๋ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
ํด๊ฒฐ๋ฐฉ์
- ๊ธฐ์กด์ ํ๋ก์ ํธ์ ํจํค์ง ๊ตฌ์ฑ์ ๊น๋ํ์ง ๋ชปํ๊ณ , ์ฐพ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ฆฌ๊ฐ ์ ๋์ง ์์ ๊ฒ์ ๋๋ผ๊ณ ,
ํ๋ก์ ํธ๋ฅผ ๊ณ์ ์งํํ๋ฉด์ ํจํค์ง๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ๊ฒ์ธ๊ฐ์ ๊ณ ๋ฏผ์ด ์๊ฒผ๋ค. ํ๋ก์ ํธ์ ํจํค์ง ๊ตฌ์ฑ์ ๊ณ์ธต๋ณ, ๊ธฐ๋ฅ๋ณ ๊ตฌ์ฑ์ผ๋ก ๋๋ ์ ์๋ค.
1.๊ธฐ๋ฅ๋ณ๋ก ๋๋๊ณ ๊ณ์ธต๋ณ๋ก ๋๋๊ธฐ
- ํด๋์ค์ ๊ธฐ๋ฅ๊ณผ ์ญํ ์ ๋ฐ๋ผ์ ํจํค์ง๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด Member์ ์ ๋ณด๋ฅผ ๊ด์ฌํ๋ ํจํค์ง๋ฅผ ๊ตฌ์ฑํ๋ค๋ฉด, memberํจํค์ง ์์ domain, service, dto, repository๊ฐ ํฌํจ๋์ด ๊ตฌ์ฑ๋๊ฒ ๋๋ค.
ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ํจํค์ง ์์ ํด๋์ค ์๊ฐ ์ฆ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ๋ณ ๊ตฌ์ฑ์ด ์ฌ์ฌ์ฉ์ฑ์ด ์ข๊ณ Package Principle์ ์ ์งํค๊ธฐ๋ ์ด์ ์ด ์์ด, ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ ๋ฆฌ๋ฅผ ํ์์.
ํด๊ฒฐ๋ฐฉ์
- - ERD๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์ง๋ง ์ฐ๊ด๊ด๊ณ, oneTomany์ manyToOne์ ๋ํ ๊ฐ๊ฐ ์ดํด๊ฐ ๋ถ์กฑํด, ์๋ฌ๊ฐ ๋ฐ์ํ์์
OneToMany(1 : N) ๋ฅผ ์ฌ์ฉ์ : ์ฐธ์กฐ๊ฐ Like๊ฐ ์ฌ๋ฌ movie์ ์ ์ฉ๋๋ค ์๊ฐํด OneToMany๋ฅผ ์ ์ฉ์์ผ๋ด
โ ์ฐ๊ด๊ด๊ณ ์ฌํ์ธ ๋ฐ ์์ ํ ์ฌ์คํ์ ๋น๋์ค ์ ์ฒด์ ์ข์์ ์นด์ดํธ ์ฆ๊ฐ
ManyToOne(N : 1) ์ฌ์ฉ : ์ฌ๋ฌ movie๋ฅผ ์ข์์ ํ ์ ์๊ณ ๊ณ ์ ๊ณ์ ์ผ๋ก ํ๋์ ์ํ์๋ง ์ข์์ ๊ฐ๋ฅ
โ ์ด๋ค ์ํฐํฐ๋ฅผ ์ค์ฌ์ผ๋ก ์๋ ์ํฐํฐ๋ฅผ ๋ฐ๋ผ๋ณด๋๋์ ๋ฐ๋ผ ๋ค์ค์ฑ์ด ๋ค๋ฅธ๊ฒ ๋จ
ํด๊ฒฐ๋ฐฉ์
์ต์ด ๋ฌธ์ ๋ฐ์
- Spring์ผ๋ก ํ์ด์ง์ ๊ณต๋ถํ๋ ์ค ๊ธฐ๋ณธ์์ ๋ฅผ ์์ฉํ์ฌ ๋ด ํ๋ก์ ํธ์ ์ ์ฉํ ํ ์๋ฒ ์์์ ๋ฐ๋ก nullpointException ๋ฐ์.
- A.ํด๋ผ์ด์ธํธ ์ํ
- ํด๋ผ์ด์ธํธ์ internal server error 500 ๋ฐ์
- B. ์๋ฒ์ํ
- videoRepository.findAll(pageable)์์ null๋ฐ์.
- c. ์ดํ๋ฆฌ์ผ์ด์
์ ๋ณด
- DB์๋ ์ํ๋ฐ์ดํฐ๊ฐ ์ ์์ ์ผ๋ก ์ ์ฅ๋์ด์์.
- Videoํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ์ ์์ ์ผ๋ก ์๋ํจ.
- ํด๋ผ์ด์ธํธ๋ ๋น์ฐํ 500error๊ฐ ๋ฐ์ ํ ์ ๋ฐ์ ์์.
- DB์ ์ ์์ ์ผ๋ก ์ ์ฅ๋๊ณ ๊ด๋ จ๊ธฐ๋ฅ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์
- ์๋ฒ๋ ๊ธฐํ ์ฌ๋ฌ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ด์ํ์ ๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์
- videoRepository.findAll(pageable) ๋ถ๋ถ์์๋ง nullpointException ์ด ๋ฐ์ํจ.
- ๋ฐ๋ผ์ ๋ด๊ฐ ๊ฐ์ ธ์จ ์์ ์ฝ๋๊ฐ ์๋ชป๋ ์ฝ๋๋ผ๊ณ ํ๋จํจ.
@GetMapping("/video/pagination")
public ResponseEntity MoviePagination(final Pageable pageable) {
Page<Video> videos =
videoRepository.findAll(pageable);
return new ResponseEntity<>(posts,HttpStatus.OK);
}@Repository
public interface VideoRepository extends JpaRepository<Video, Long> {
}- DB์์ ํด๋น ๋ฐ์ดํฐ ์ ๋ถ๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ๋ฐ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฅํ๋ค(Sort) --> null์ด๋จ.
- ๋ถ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ๋น์ฆ๋์ค๋ก์ง์์ ๋ฐ์์ ๋ค์ ์ปจํธ๋กค๋ฌ๋ก ์ ์กํ๋ค.
- ์ปจํธ๋กค๋ฌ์์ ํด๋ผ์ด์ธํธ๋ก ํ์ด์งํ ๋ฐ์ดํฐ๋ฅผ ์๋ตํ๋ค.
- 2๋ฒ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ.
- JpaRepository๋ฅผ ์์๋ฐ์ Repository๋ ํ์ด์ง๊ด๋ จ Repository๋ ์์๋ฐ์์ db์์ ๊ฐ์ ธ์ฌ๋ ํ์ด์งํ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํด์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ๊ทธ๋ฐ๋ฐ ๋๋ Pageable๋ง ์ฌ์ฉํ๋๋ฐ ์ด Pageable๋ง ์ฌ์ฉํ์ง ํด๋น ๋ถ๋ฅ๋ด์ฉ์ ๋ด๊ฐ ์ง์ ํ์ง ์์๋ ๊ฒ์ด๋ค.
- ๋ฐ๋ผ์ ํด๋น ๋ถ๋ฅ๋ ๋ด์ฉ์ ์ง์ ํ์ง ์์์ผ๋ null์ด ๋๊ณ nullpointException์ด ๋ฐ์ํ ๊ฒ์ด์๋ค.
- Pageable์ ๊ฐ์ ์ง์ ํด์ฃผ๊ธฐ ์ํด ๊ฐ ๋ฐ์ดํฐ๊ฐ์ ์์ฒญ๋ฐ์
@GetMapping("/video/pagination")
public ResponseDto<?> getPaging(
@RequestParam("page") int page,
@RequestParam("size") int size,
@RequestParam("sortBy") String sortBy,
@RequestParam("isAsc") boolean isAsc
) {
page = page - 1;
return pagingService.getPagenation(page, size,sortBy,isAsc);
}โข ์ฐธ๊ณ : @RequestParam("sortBy") String sortBy ์ด๋ถ๋ถ DESC๋ ASC์ ๊ฐ์ด OrderBy๊ฐ ์๋๋ผ id, title๊ณผ ๊ฐ์ ๋ถ๋ฅ๊ธฐ์ค์ด๋ค.
@Transactional
public ResponseDto<?> getPagenation(int page, int size, String sortBy, boolean isAsc) {
Sort.Direction direction = isAsc ? Sort.Direction.ASC : Sort.Direction.DESC;
Sort sort = Sort.by(direction, sortBy);
Pageable pageable = PageRequest.of(page, size,sort);
Page<Video> videos = videoRepository.findAll(pageable);
List<VideoResponseDto> videoResponseDtoList = new ArrayList<>();
for (Video video : videos){
videoResponseDtoList.add(
VideoResponseDto.builder()
.id(video.getId())
.title(video.getTitle())
.poster_path(video.getPosterPath())
.overview(video.getOverview())
.first_date(video.getRelease_date())
.grade(video.getPopularity())
.youtubePath(video.getYoutubePath())
.backdrop_path(video.getBackdrop_path())
.homepage(video.getHomepage())
.likeCnt(video.getLikeCnt())
.build()
);
}
return ResponseDto.success(videoResponseDtoList);
}โข ๋ง์ง๋ง์ผ๋ก Repository์์๋ ์ ์ ํด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋์ผ ํด๋น๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๋ถ๋ฅํด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ค๋ค.
@Repository
public interface VideoRepository extends JpaRepository<Video, Long> {
Page<Video> findAll(Pageable pageable);
}ํฌ์คํธ๋งจ์์ http://localhost:8080/video/pagination?page=1&size=3&sortBy=id&isAsc=true
{
"statusCode": 200,
"msg": "OK",
"data": [
{
"id": 2,
"title": "๋๋๊ณค๋ณผ ์ํผ: ์ํผ ํ์ด๋ก",
"poster_path": "https://image.tmdb.org/t/p/w500/uohymzBVaIYjbnoQstbnlia6ZPJ.jpg",
"overview": "2018๋
์ ๊ฐ๋ดํ ์ ์ด์ ์๋ฆฌ์ฆ์ ๋ ๋ฒ์งธ ์ํ",
"first_date": "2022-06-11",
"grade": 7195.285,
"youtubePath": "https://www.youtube.com/embed/GD8nCSr54PA?autoplay=1&mute=1",
"backdrop_path": "https://image.tmdb.org/t/p/w500/ugS5FVfCI3RV0ZwZtBV3HAV75OX.jpg",
"homepage": "https://www.2022dbs-global.com",
"likeCnt": 0
},
{
"id": 9,
"title": "ํ ๋ฅด: ๋ฌ๋ธ ์ค ์ฌ๋",
"poster_path": "https://image.tmdb.org/t/p/w500/bZLrpWM065h5bu1msUcPmLFsHBe.jpg",
"overview": "์ด๋ํผ์ค๋ฅผ ์ํด ์์ ์ฐพ๊ธฐ ์ฌ์ ์ ๋ ๋ ์ฒ๋ฅ์ ์ ํ ๋ฅด. ๊ทธ๋ฌ๋, ์ฐ์ฃผ์ ๋ชจ๋ ์ ๋ค์ ๋ชฐ์ดํ๋ ค๋ ์ ๋์ด์ ๊ณ ๋ฅด์ ๋ฑ์ฅ์ผ๋ก ํ ๋ฅด์ ์์๋
๊ณํ์ ์ฐ์ฐ์กฐ๊ฐ ๋๋ฒ๋ฆฐ๋ค. ํ ๋ฅด๋์๋ก์ด ์ํ์ ๋ง์๊ธฐ ์ํด, ํน ๋ฐํค๋ฆฌ, ์ฝ๋ฅด๊ทธ, ๊ทธ๋ฆฌ๊ณ ์ ์ฌ์์น๊ตฌ ์ ์ธ๊ณผ ์ฌํํ๊ฒ ๋๋๋ฐ. ๊ทธ๋
๊ฐ ๋ฌ ๋๋ฅด๋ฅผ ํ๋๋ฅด๋ ๋ง์ดํฐ ํ ๋ฅด๊ฐ ๋์ด ๋ํ๋ ๋ชจ๋๋ฅผ ๋๋ผ๊ฒ ํ๋ค. ์ด์ , ํ ํ ๋ฅด๋ ๊ณ ๋ฅด์ ๋ณต์์ ์ฝํ ๋ฏธ์คํฐ๋ฆฌ๋ฅผ ๋ฐํ๊ณ ๋ ํฐ ์ ์์ ๋ง๊ธฐ ์ํ ์ ์ฐ์ฃผ์ ์ค์ผ์ผ์ ๋ชจํ์ ์์ํ๋๋ฐ...",
"first_date": "2022-07-06",
"grade": 7623.514,
"youtubePath": "https://www.youtube.com/embed/Go8nTmfrQd8?autoplay=1&mute=1",
"backdrop_path": "https://image.tmdb.org/t/p/w500/p1F51Lvj3sMopG948F5HsBbl43C.jpg",
"homepage": "https://www.marvel.com/movies/thor-love-and-thunder",
"likeCnt": 0
},
{
"id": 15,
"title": "ํ๋ ์ด",
"poster_path": "https://image.tmdb.org/t/p/w500/eicYAopFKOL3orcNTJZ4TGtZQQ1.jpg",
"overview": "300๋
์ ์๋ฉ๋ฆฌ์นด, ์ฉ๋งนํ ์ ์ฌ๋ฅผ ๊ฟ๊พธ๋ ์์ฃผ๋ฏผ ์๋
๋๋ฃจ๋ ๊ฐ์์ค๋ฌ์ด ๊ณฐ์ ์ต๊ฒฉ์ผ๋ก ์ ์ฒด์ ๋ช
์ ์๊ธฐ์ ๋์ธ ์๊ฐ, ์ ์ฒด๋ฅผ ์ ์ ์๋ ์ธ๊ณ ํฌ์์ ํ๋ ๋ฐํฐ๋ฅผ ๋ชฉ๊ฒฉํ๊ฒ ๋๋ค. ์์ ๋ณด๋ค ๊ฐํ ์๋๋ฅผ ํฅํ ๋ฌด์๋นํ ์ฌ๋ฅ์ ์์ํ ํ๋ ๋ฐํฐ. ์ต์ฒจ๋จ ๊ธฐ์ ๊ณผ ๋ฌด๊ธฐ๋ก ์งํ๋ ์ธ๊ณ ํฌ์์ ํ๋ ๋ฐํฐ์ ์ํ์ด ์ ์ ๋ค๊ฐ์ค๊ณ ๋๋ฃจ๋ ๋ถ์กฑ์ ์งํค๊ธฐ ์ํด ์์ ๋ง์ ๊ธฐ์ง์ ๋ฌด๊ธฐ๋ก ์์กด์ ๊ฑด ์ฌํฌ๋ฅผ ์์ํ๋๋ฐโฆ",
"first_date": "2022-08-02",
"grade": 5763.164,
"youtubePath": "https://www.youtube.com/embed/wZ7LytagKlc?autoplay=1&mute=1",
"backdrop_path": "https://image.tmdb.org/t/p/w500/7ZO9yoEU2fAHKhmJWfAc2QIPWJg.jpg",
"homepage": "https://www.20thcenturystudios.com/movies/prey",
"likeCnt": 0
}
]
}- ํ์ด์ง์ ๊ตฌ์กฐ ๋ฐ ์๋๋ฐฉ์ ์ฐธ๊ณ
- [Spring Boot] JPA + Pageable ์ ์ด์ฉํ ํ์ด์ง ์ฒ๋ฆฌย http://devstory.ibksplatform.com/2020/03/spring-boot-jpa-pageable.html
- ์คํ๋ง๋ถํธ ๊ฒ์, ํ์ด์ง์ฒ๋ฆฌ ํ๊ธฐ Pageable
- https://gonyda.tistory.com/15
- [Spring] Spring Data JPA์์ Paging ๊ฐ๋จํ๊ฒ ๊ตฌํํ๋ ๋ฒ
- https://devlog-wjdrbs96.tistory.com/414
- ์คํ๋ฅดํ ์ฝ๋ฉํด๋ฝ ์คํ๋ง ์ฌํ 4์ฃผ์ฐจ ๊ฐ์์๋ฃ
- Pagination
- themoviedb์คํAPI
- ๋ค์ด๋ฒ ๊ฒ์ API
- ์นด์นด์ค์์ ๋ก๊ทธ์ธ




