Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reservation System 구현(JPA) #23

Open
wants to merge 3 commits into
base: kick-sim
Choose a base branch
from

Conversation

kick-sim
Copy link
Collaborator

Week4(Reservation(JPA))

Controller

  • 사용자의 요청을 처리하는 역할
  • CategoryController - category 관련 요청 처리
  • ProductController - product 관련 요청 처리
  • GlobalCacher - Controller내의 모든 예외를 처리

Dto

  • request 폴더 - 요청에 필요한 필드를 담은 클래스 구현
  • response 폴더 - 응답에 필요한 필드를 담은 클래스 구현

Entity

테이블에 존재하는 칼럼들을 필드로 가지고있는 객체

  • Category - 데이터베이스에 담길 Category의 정보를 담는 객체 @entity 어노테이션을 통해 데이터베이스의 테이블과 필드를 일대일로 매칭
  • Product - 데이터베이스에 담길 Category의 정보를 담는 객체 @entity 어노테이션을 통해 데이터베이스의 테이블과 필드를 일대일로 매칭

Repository

Etity에 있는 데이터를 조회하거나 저장과 변경 그리고 삭제를 할때 Spring JPA에서 제공하는 Repository라는 인터페이스를 정의해 해당 Entity와 매핑된 데이터베이스를 처리하는 역할

Service

사용자의 요청에 맞도록 정보를 가공하는 역할

  • CategoryService - category 관련 요청 정보 가공
  • ProductService - product 관련 요청 정보 가공

새롭게 공부한 것

-예외처리(GlobalCatcher)-

메서드 단위 처리 try catch - 코드가 복잡해지고 유지보수가 어려움

Controller단에서 처리 @ExceptionHandler - 다른 Controller에서 사용할수 없음 범용성이 낮다

전역 처리 @ControllerAdvice사용 - 모든 Controller에서 발생한 예외를 처리할 수 있다

  • Controller전체에서 발생한 예외를 처리할수있는 GlobalCatcher 클래스 생성
  • @ExceptionHandler어노테이션을 통해 예외를 처리하는 메서드 선언

@transactional

  • 데이터를 처리하는 중에 다른 데이터를 동시에 처리하지 못하게 하여 데이터간의 충돌을 막고 DB로의 의도치 않은 처리를 막음

@entity

  • 데이터베이스의 테이블과 일대일로 매칭되는 객체 단위

@id

  • 유일한 키값인 Primary Key임을 표시

@GeneratedValue

  • auto increament 칼럼인 것을 Entity Manager에 알려주는 역할

@onetomany

  • 하나의 카테고리에 하나 이상N개의 상품이 등록
  • N개의 상품들을 전부 가져올수있게 함

@manytoone

  • 카테고리의 id값만 간접적으로 참조하는 것이 아니라 카테고리의 엔티티를 소유하게 함

어려웠던 점

  • MVC패턴에 맞게 구조를 짜는게 아직도 익숙치 않아서 헤맸습니다
  • 모르는 어노테이션들이 많아 하나하나 찾아보는데 하나 찾아보면 그 설명에 또 모르는게 2개 3개씩 생겨서 힘들었습니다

코드리뷰 받고싶은 점

  1. 컨트롤러단에서 처리 Controller Level - @ExceptionHandler.
  2. 전역 처리 Global Level - @ControllerAdvice.
  3. 메서드단위 처리 Method Level - try/catch.

예외처리를 함에 있어서 전역처리보다 컨트롤러단이나 매서드 단위로 처리하는 경우의 장점이 있는지 궁금합니다.

예외처리를 처음해봐서 보통 API에서 예외를 어떻게 처리하는지를 몰라 예외처리 부분을 리뷰받고 싶습니다.

같은 Entity 안에서 다른 데이터를 각각 원할때 @query어노테이션을 통해서 쿼리문을 작성해서 원하는 데이터만 조회가 가능한지 궁금합니다.

dto.response에 각기 다른 응답들을 위해 각기 다른 클래스를 만들다보니 많은 클래스가 만들어졌는데 공통된 필드를 가진 클래스가 많아서 이것을 줄이고 싶은데 줄일 방법이 있는지 궁금합니다.

@kick-sim
Copy link
Collaborator Author

kick-sim commented Sep 2, 2022

##요악
Spring Security를 활용한 jwt 기반 인증 방식을 사용

4주차과제에서의 변경점

  • SecurityConfig 클래스 생성 - Security에 관한 환경설정 클래스

  • AuthController, UserController생성 - 인증, 유저 각각에 관한 사용자의 요청 처리

  • 컨트롤러의 각 메소드를 목적에 맞게 권한을 가진 유저만 호출가능하게 변경

  • LoginRequest, UserRequest 생성

  • TokenResponse, UserResponse 생성

  • Authority, User Entity 생성

  • Product Entity에 register필드 추가

  • Exception 폴더 생성 Jwt사용에 있어 발생하는 예외를 처리해주는 클래스를 담은 폴더

  • Jwt폴더 생성

    - TokenProvider: 토큰을 생성하는 역할
    
    - JwtFilter: FilterChain내에서 JwtFilter에서 동작하는 방식을 정의
    
    - JwtSecurityCofig: JwtSecurity에 관한 환경설정 클래스(ex: SecurityFilterChain에서 어느 자리에 JwtFilter를 끼워넣을지)
    
  • UserRepository 생성

  • AuthService 생성

  • CustomUserDetail -AuthenticationProvider에게 토큰이 유효한지 아닌지의 여부를 요청받고 유효하다면 Authentication 객체 반환

  • UserService 생성

  • SecurityUtil 생성 authentication에서 유저이름을 받아오는 유틸성 클래스

##어려웠던 점##

어제까지 잘 돌아가던 코드가 다음 날 엄청나게 많은 오류를 맞이했습니다.

  • Public Key Retrieval is not allowed
  • Failed to initialize JPA EntityManagerFactory: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
  • Exception during pool initialization.
  • Could not obtain connection to query metadata

-해결 방법-

구글링 해본결과 에러가 발생하는 원인은 useSSL=false로 설정하고 allowPublicKeyRetrieval설정을 하지 않은 경우라고 합니다.

useSSL이란 서버SSL인증서검증에 관한 설정이고

allowPublicKeyRetrieval이란 서버에서 RSA공용키를 가져올수있게하는 설정이라고 합니다

근데 왜 두 설정을 다 해야 오류가 사라지는지 찾아봐도 이유가 나오지 않았습니다… ㅠ

##코드 리뷰 받고싶은 점##

  • 솔직히 너무 처음보는 내용이고 어려운 부분이 많아서 코드를 짜면서 아직 이해가 미흡한 상태로 짠 부분도 많다고 느꼈습니다. Token사용에있어 전체적인 구조에 관한 부분을 리뷰받고싶습니다
  • 위에 어려웠던 점에서 해결하지못한 왜 useSSL설정과 allowPublicKeyRetrieval설정을 해야 오류가 사라지는지에 대해 궁금합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant