분류 전체보기
스프링 인터셉터와 어노테이션으로 인증 및 권한 관리하기
사이드 프로젝트를 진행하면서 좀 더 효율적으로 인증 및 권한 관리를 할 수 없을까 고민하면서 해 본 방법을 정리한 글입니다. 기존의 상황 먼저 사이드 프로젝트의 요구사항을 보면, 비회원 유저와 회원 유저(Member)로 구분되며, (인증 체크 필요) 여러 유저가 속해 있을 수 있는 그룹(Organization)이라는 개념이 존재하며, 그룹 내에 관리자(ADMIN)와 일반(USER) 멤버 두 가지 형태로 존재하며 각기 다른 권한 범위를 가지고 있습니다. (권한 체크 필요) 요약하면 현재 저희 프로젝트에서 현재까지 필요한 인증 및 권한 작업은 로그인하지 않아도 되는 API (인증이 필요 없는 API) 로그인이 필요한 API (인증이 필요한 API) 특정 그룹에 속해 있어야 하는 API (관리자 or 일반 멤..
[Real MySQL] 16장. 베스트 프랙티 - SQL 작성 표준
조인 조건은 항상 ON 절에 기재하자. MySQL의 조인 조건은 WHERE절에 모두 모아서 표기할 수도 있고, JOIN 키워드를 이용해 각 ON절에 명시할 수 도 있다. SELECT * FROM employees e LEFT JOIN dept_manager dm WHERE e.first_name='Smith' AND dm.emp_no=em.emp_no; 하지만, 위와 같은 형태의 쿼리는 MySQL 옵티마이저가 LEFT JOIN이 아니라 INNER JOIN으로 고쳐서 실행해 버리므로, 의도한 결과와는 다른 결과가 나오게 된다. 따라서 LEFT JOIN 뿐만 아니라 INNER JOIN에서도 SQL 표준 조인 표기법으로 작성하고 반드시 조인 조건은 WHERE 절이 아니라 조인의 ON 절에 명시하자! 테이블 별..
[JPA] 1차 캐시 vs 2차 캐시
JPA에 대해서 헷갈렸던 개념들을 위주로 정리하는 글입니다. 1차 캐시와 2차 캐시 네트워크를 통해 데이터베이스에 접근하는 시간 비용은 애플리케이션 서버 내부 메모리에 접근하는 시간보다 훨씬 비싸다. 따라서 조회한 데이터를 메모리에 캐싱해 두면 데이터베이스 접근 횟수를 줄여 성능을 개선할 수 있다. 1차 캐시 영속성 컨텍스트 내부에는 엔티티를 보관하는 저장소가 있는데 이를 1차 캐시라고 한다. 일반적으로 트랜잭션을 시작하고 종료할 때까지만 1차 캐시가 유효하다. OSIV를 사용하더라도 사용자의 요청이 들어올 때부터 끝날 때까지만 1차 캐시가 유효하다. 특징 같은 엔티티가 있으면 객체 동일성을 보장한다. (==) 2차 캐시 애플리케이션 범위의 캐시로, 공유 캐시라고도 한다. 따라서 애플리케이션을 종료할 때..
[JPA] @Transaction(readOnly=true) 성능 향상 이유?
개요 스프링 프레임워크에서 어노테이션으로 트랜잭션을 읽기 전용 모드로 설정할 수 있다. @Transactional(readOnly = true) 예상치 못한 엔티티의 등록, 변경, 삭제를 예방할 수 있고, 또한 성능을 최적화할 수 있습니다. 하지만 왜?? 성능을 최적화 할 수 있는지는 알지 못했습니다. 그래서 정리해본 글입니다. 읽기 전용 쿼리의 성능 최적화 엔티티가 영속성 컨텍스트에 관리되면 1차 캐시부터 변경 감지까지 얻을 수 있는 혜택이 많다. 하지만 영속성 컨텍스트는 변경 감지를 위해서 스냅샷 인스턴스를 보관하므로 더 많은 메모리를 사용하는 단점이 존재한다. 혹시 영속성 컨텍스트와 변경 감지가 동작하는 원리에 대한 정보는 아래 글을 참고해주세요. [JPA] 영속성 컨텍스트란? JPA에 대해서 헷갈..
[JPA] 영속성 컨텍스트와 트랜잭션, OSIV
JPA에 대해서 헷갈렸던 개념들을 위주로 정리하는 글입니다. OSIV 위의 모든 문제는 엔티티가 프레젠테이션 계층에서 준영속 상태이기 때문에 발생한다. 영속성 컨텍스트를 뷰까지 살아있게 열어두는 것을 OSIV라고 한다. 즉, OSIV란 영속성 컨텍스트를 뷰까지 열어둔다는 뜻이다. 과거의 OSIV: 요청 당 트랜잭션 요청이 들어오자마자 서블릿 필터나 스프링 인터셉터에서 영속성 컨텍스트를 만들면서 트랜잭션을 시작하고 요청이 끝날 때 트랜잭션과 영속성 컨텍스트를 함께 종료한다. 문제점 컨트롤러나 뷰 같은 프레젠테이션 계층이 엔티티를 변경할 수 있다는 점. 해결 방법 - 엔티티를 읽기 전용 인터페이스로 제공 - 엔티티 래핑 - DTO만 반환 스프링 OSIV: 비즈니스 계층 트랜잭션 과거의 OSIV는 요청 당 트..