SBLR

lejehwan·2021년 8월 31일

Project

목록 보기
2/4
post-thumbnail

1. Spring Security

인증과 인가 및 보호를 제공하는 프레임워크다.

  • 인증과 인가??

    📌인증(Authentication) : 식별 가능한 정보로 서비스에 등록된 유저의 신원을 입증하는 과정
    ex)로그인 하는 과정
    📌인가(Authorization) : 인증된 사용자에 대한 자원 접근 권한 확인
    ex)로그인 후 게시판에 글 작성 가능
    ✔ 즉, 자원을 (적절한/유효한) 사용자에게 (전달/공개) 하기 위한 방법

타사 서비스에 대한 제한된 접근을 얻기 위한 애플리케이션이다.

  • How??

    1. 유저가 로그인 요청을 함
    2. Access Token을 받기 위한 Resource Server로 연결됨
    3. 로그인 되었다면, 이전 요청(client_id)과 서버의 redirect_id가 동일한지 확인함
    4. 일치한다면, scope(email,profile 등)에 대한 기능을 넘겨줄 승인여부 확인
    5. 동의한다면, authorization_code라는 임시 pw 발급
    6. 이후 Redirect 되어 개발자의 서버는 authorizaion_code를 가지고, Resource Server에게 Access Token을 요청함
    7. 유저의 정보가 필요할 때면 Access Token을 통해 접근함
  • OAuth 1.0 VS OAuth 2.0??

    👆 인증 절차 간소화 : 기능 단순화 및 규모 확장성을 지원을 위해 디지털 서명 기반의 암호화 대신 HTTPS의 암호화에 맡김
    👆 용어 변경
    🤟 다양한 인증 방식 제공 : Authorization code Grant 방식 뿐만 아니라 Device code Grant, Implicit Grant 등의 많은 인증 방식 제공

  • so, Why use OAuth

    사용자 측면 :

    👉 해당 서비스에 ID/PW를 알려주지 않아도 됨
    👉 원할 때 Access Token의 권한 취소가 가능함

    서비스 측면 :

    👉 유저의 Access Token만 가지고 있으면 됨
    👉 사용자의 ID/PW를 몰라도 허가 받은 API 접근 가능

2. JPA

데이터 접근을 필요로 하는 Spring 기반 애플리케이션을 더 쉽게 구축할 수 있다.

🔎 JPA(Java Persistence API) : 자바 진영의 ORM 기술 표준 인터페이스

  • ORM이란??

    🔎 ORM(Object Relational Mapping) : 객체(클래스) 와 관계형 데이터 베이스(관계) 와의 설정

  • Why ORM??

    이때까지

    🌖 관계형 DB에는 객체를 가질 수 없다.
    🌗 객체지향적인 표현이 되지 않는다.
    🌑 => 패러다임의 불일치

물리적으로는 SQL과 JDBC API를 데이터 접근 계층에 숨겼을 지라도,
논리적으로는 Entity와 상당한 의존관계를 가지고 있다.

이를 해결하고자 ORM( JPA(인터페이스), Hibernate(구현체) )가 등장


  • 영속성 컨텍스트(Entity Manager)

    논리적인 개념으로써 엔티티를 영구 저장하는 환경으로써 아래 4가지 context를 가진다.

🔎 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
🔎 영속(managed): 영속성 컨텍스트에 저장된 상태
🔎 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
🔎 삭제(removed): 삭제된 상태

  • How??

    1. 비영속 상태에서 persist를 해준다.
    2. persist된 Entity가 영속성 컨텍스트에 올라감(영속 상태)
    3. 영속성 컨텍스트 안에서 관리를 받다가 flush 이후 DB에 접근함 (SQL 생성)
  • Merits

👆 Lazy Loading(지연 로딩) : proxy 객체를 사용하여 필요한 내용만 가져옴(불필요한 데이터까지 가져올 필요가 없음)
Dirty Checking(변경 감지) : snapshot을 이용하여 변경된 부분을 알아서 찾아냄(영속 상태의 엔티티만 적용)
🤟 Caching(1차 캐시) : 영속성 컨텍스트 내부 캐시에 엔티티를 저장함(캐시에 저장된 내용을 요청시 DB를 접근하지 않고 캐시에서 줌)
🖖 동일성 보장 : 영속성 컨텍스트는 엔티티의 동일성을 보장한다.

  • Why use Spring data JPA??

👉 spring framework에서 JPA를 편리하게 사용할 수 있도록 지원

  • CRUD 처리를 위한 공통 인터페이스 제공
  • repository 개발 시 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 구현 객체를 동적으로 생성해서 주입
  • 데이터 접근 계층을 개발할 때 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있도록 지원

3. Feedback

🎯 JPA 연관관계 매핑에 대한 이해 부족

public class User {

    //~생략//

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)
    @JsonIgnoreProperties({"user"})
    @OrderBy("id desc")
    private List<Review> review;
}
    
class Room {

    //~생략//

    @OneToMany(mappedBy = "room",fetch = FetchType.EAGER,cascade = CascadeType.REMOVE)
    @JsonIgnoreProperties({"room"})// 무한 참조 방지
    @OrderBy("id desc")
    private List<Review> review;

    @OneToMany(mappedBy = "reservationRoom",fetch = FetchType.LAZY,cascade = CascadeType.REMOVE)
    @JsonIgnoreProperties({"reservationRoom"})
    @OrderBy("id desc")
    private List<Reservation> reservations;
}
    
class Review {

   //~생략//

    @ManyToOne
    @JoinColumn(name = "roomId")
    private Room room;

    @ManyToOne
    @JoinColumn(name = "userId")
    private User user;
}

public class Reservation {

    //~생략//

    @ManyToOne
    @JoinColumn(name = "roomId")
    private Room reservationRoom;
}

📃 연관관계 매핑하는 과정에서의 연관관계 주인, mappedby와 같이 이해가 부족했었음.

🎯 쿼리에 대한 실력 부족(JPQL, QueryDSL이 아닌 순수 쿼리)

public List<Room> findRoomByReservation(Reservation reservation) throws ParseException {
        //~생략//
        
            if (RstartDate.after(endDate) && reservation.getRoomType().equals(room.getRoomType()) &&
                    reservation.getCountPerson() <= room.getMaxPerson()){
                findRoom.add(room);
            }
        }
        
        //~생략//
    }

📃 쿼리를 짜는 실력이 부족하여 Service 부분에서 if문으로 처리함.


4. More Info

https://github.com/SBWGL/SBLR

profile
물지만 않으면 괜찮아

0개의 댓글