[12.18] 내일배움캠프[Spring] WIL-6

박상훈·2022년 12월 18일
0

내일배움캠프[WIL]

목록 보기
6/12

[12.18] 내일배움캠프[Spring] WIL-6

1. 지난 일주일

  • Spring 숙련에 관한 학습을 진행했다.
    1) Jpa 역할에 대해 상세 구현 원리와, 그에 따른 구현 기능을 알아보았다.
    2) 어떻게 어노테이션으로 해당 객체가 매핑 되며, Spring Bean에 대해서 학습했다.
    3) @Entity 를 여러개로 분리하였을 때, 어떠한 연관관계가 있고, 그 연관관계에 대한 외래키의 개념을 학습하고 실습했다.
    4) UI를 제외하고 PostMan을 통해 Controller(Url) -> Service -> Repository순으로 원하는 기능에 대한 요청과 응답값을 확인하는 과제를 진행했다.
    5) 인증 -> 인가 방식으로 JWT 방식을 사용해 보았다.

2. 어려웠던 점

1) @Entity의 연관 관계를 매핑 할 때, 단방향 양방향 연관관계에 대한 어려움이 존재했고 아직
@ManyToMany의 연관 관계는 조금 더 학습해야 할 것 같다.
2) JWT의 방식의 진행과 토큰을 만들고, 토큰의 유효성을 검증하는 부분의 로직에 대한 이해는 했지만,
만약 이 부분을 스스로 다시 만들어 보라고 하면 조금 힘들 것 같다.. 기존에 있는 것을 가져다가 쓸듯..!

3. 배운점

  • @Entity매핑 시 항상 양방향으로 연관시켜 놓는게 좋을 것이라고 생각했다.
    ->TIL34에서도 언급했듯, 이렇게 된다면 많은 연관 관계를 맺고 있는 하나의 엔티티가 무거워진다.
    -> 따라서 단방향의 연관관계를 사용하고, 필요에 따라 양방향의 연관관계를 매핑하자!

  • 페이징 처리 방식에 대해 아직은 모호하지만 이런 식으로 사용되는 구나 라는 것을 학습했다.
@Transactional(readOnly = true)
    public Page<Product> getProducts(HttpServletRequest request,
                                              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);

        // Request에서 Token 가져오기
        String token = jwtUtil.resolveToken(request);
        Claims claims;

        // 토큰이 있는 경우에만 관심상품 조회 가능
        if (token != null) {
            // Token 검증
            if (jwtUtil.validateToken(token)) {
                // 토큰에서 사용자 정보 가져오기
                claims = jwtUtil.getUserInfoFromToken(token);
            } else {
                throw new IllegalArgumentException("Token Error");
            }

            // 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
            User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
                    () -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
            );

            // 사용자 권한 가져와서 ADMIN 이면 전체 조회, USER 면 본인이 추가한 부분 조회
            UserRoleEnum userRoleEnum = user.getRole();
            System.out.println("role = " + userRoleEnum);

            Page<Product> products;

            if (userRoleEnum == UserRoleEnum.USER) {
                // 사용자 권한이 USER일 경우
                products = productRepository.findAllByUserId(user.getId(), pageable);
            } else {
                products = productRepository.findAll(pageable);
            }

4. 느낀점⭐

1) @Entity매핑과 연관관계 설정시 무작정 하지말고 정확한 설계를 바탕으로 진행해야겠다..중요..!
2) 세션 - 쿠키 의 방식보다 JWT방식이 가지고 있는 이점이 확실히 강력한 것 같다..!

profile
기록하는 습관

0개의 댓글