'Development/Diary' 카테고리의 글 목록 (2 Page)
본문 바로가기

Development/Diary

(32)
[Diary][Spring] Spring에서 Module에 BaseEntity를 추가하면, @EntityListeners(AuditingEntityListener.class)가 잘 되나? 문제 상황createdAt, updatedAt과 같은 감사 로그는 공통적으로 사용되는 필드가 많기 때문에 BaseEntity를 자주 사용한다.그런데 이를 모듈에 추가하고, 메인 프로젝트에서 이 모듈로 추가한 BaseEntitiy를 상속하면 잘 될까?그리고 위와 같이, BaseEntity를 사용하기 위한 엔티티 및 설정을 추가해주었다.처음엔 안 될거라고 생각했다.왜냐하면 우선 Component Scan의 대해 생각해보았다.Component Scan 범위는 @SpringbootApplication 에서 기본적으로 이 어노테이션이 적용된 클래스를 포함한 하위 패키지인데,추가한 모듈은 범위 밖에 있기 때문에 Bean 을 못 찾고, 마찬가지로 JPA Audit 관련 기능도 BaseEntity를 찾지 못하겠지? 란..
[Diary][Spring] Spring Cloud Gateway에 인가의 책임을 부여해볼까? 프로젝트를 진행하면서 게이트웨이를 구현하는 역할을 담당하였습니다. 저희 팀은 JWT 인증 및 엔드포인트 별 권한 검증을 게이트웨이에서 구현하기로 결정했습니다.그러다가 제가 생각했던 문제점과 문제 해결을 위해 시도한 방법, 그리고 그 방법의 문제점을 소개하고자 합니다. 문제 상황: Spring Cloud Gateway의 재시동 문제엔드포인트 별 권한 검증을 Gateway에서 하기로 했다. 따라서 Reactive Spring Security를 사용해서 필터 체인에 구현했다.하지만, 각 서비스별 인가 정책이 바뀐다면 이를 반영하기 위해 Gateway의 코드를 수정하고, 재시동해야 하는 문제가 있다. 이러한 문제는 모든 엔드포인트의 라우팅을 담당하는 Gateway에 있어 좋지 않다고 판단했다.이에 무중단으로 정..
[Diary][Spring] Spring Webflux의 WebFilter는 자동으로 등록됩니다. (Security Filter Chain에 등록하면 발생할 수 있는 문제) 이 글에서는 WebFilter를 구현하면서 겪었던 잘못된 사용에 대해 다루고자 합니다.문제 상황Spring Cloud Gateway에 JWT 인증 필터를 구현하였다.위와 같이 @Value 값을 주입받기 위해, WebFilter를 구현하고 @Component 어노테이션을 붙여서 Bean에 등록했다.그리고 Security FilterChain에 구현한 Filter를 추가했다. 필터 우선순위도 넣어줬다.자연스러운 흐름이겠지만, 이것은 잘못된 사용이다. 왜냐하면, 디버그 모드로 찍어보면 필터를 두 번 검사하게 될 것이다.문제 원인https://docs.spring.io/spring-boot/reference/web/reactive.html#web.reactive.webflux.web-filters 문서를 참고해..
[Diary][Spring] N + 1 문제 해결을 위한 @EntityGraph를 사용할 때 주의할 점 N+1 문제 해결을 위해 적용하신 @EntityGraph의 경우, @EntityGraph를 설정할 때 필요 이상의 연관 엔티티들을 함께 로딩하게 되면 불필요한 데이터가 메모리에 적재되어 성능 저하를 유발할 수 있습니다.아래 글에서 N + 1 해결 방법으로 @EntityGraph를 사용하는 것을 선택했는데, 위와 같은 피드백을 받았습니다. [Diary] Spring ORM에서는 N + 1을 항상 신경쓰자. (tistory.com) [Diary] Spring ORM에서는 N + 1을 항상 신경쓰자.프로젝트를 진행하다가 드디어 N + 1을 마주치는 상황이 생겼습니다. 사실 이 문제가 정확히 언제 발생할 수 있는지 이해가 안 되었는데, 이렇게 쉽게 마주쳐서 기뻤습니다 후후문제 상황여기 장bezzang2.tist..
[Diary][Spring Security] UserDetails를 어떻게 캐싱할까? 문제 상황public class UserDetailsImpl implements UserDetails { private final User user; public UserDetailsImpl(User user) { this.user = user; } @Override public Collection getAuthorities() { return user.getRoles().stream() .map(role -> new SimpleGrantedAuthority(role.getRoleName())) .collect(Collectors.toList()); } @Override public ..
[Diary] Spring ORM에서는 N + 1을 항상 신경쓰자. 프로젝트를 진행하다가 드디어 N + 1을 마주치는 상황이 생겼습니다. 사실 이 문제가 정확히 언제 발생할 수 있는지 이해가 안 되었는데, 이렇게 쉽게 마주쳐서 기뻤습니다 후후문제 상황여기 장바구니 엔티티가 있다.장바구니는 User, Store, Product를 @ManyToOne으로 가지고 있다.여기서 FetchType을 명시하지 않았으므로, 자동으로 LAZY가 설정된다.아래는 이제 Response DTO를 만들기 위해서 만든 메서드이다.여기서 Cart와 연관된 Product, Store를 get 한다.이제 여기서 N + 1 문제가 발생한다. 대략 아래 log는, 위 메서드가 실행되면서 만들어지는 쿼리이다.2024-08-30T22:52:07.102+09:00 INFO 5292 --- [nio-8080-..
[Diary][Spring] Spring Security에서 Role과 Authority의 차이가 뭘까? 문제 상황위는 이미 해결한 PR인데, hasAnyRole을 사용하면 권한 체크가 안 되고, hasAnyAuthority를 사용해야 권한 체크가 잘 동작하는 일이 발생했다.문제 원인Spring Security 문서 26. Expression-Based Access Control (spring.io)  간단히 요약하면, 현재 principal에 명시된 roles 중에서hasRole([role])지정된 역할이 현재 사용자에게 있는 경우 true를 반환한다. 기본적으로 제공된 역할이 'ROLE_'로 시작하지 않으면, 'ROLE_'이 자동으로 추가된다. hasAuthority([authority])지정된 권한이 현재 사용자에게 있는 경우 true를 반환한다.하지만 UserRoleEnum 에서는 ROLE_을 붙이고..
[Diary][Spring] 식별,비식별 관계? 관계의 방향? 외래 키의 주인? ERD를 설계하고, 엔티티 간에 관계를 매핑할 때 항상 헷갈리는 개념이 있습니다.일대다, 다대다 이런 관계는 알겠는데, 식별 관계로 할지, 비식별 관계로 할지, 그럼 엔티티 간에 관계는 양방향일지 단방향일지, 그럼 외래 키의 주인은 누구로 할지를 추가적으로 정해야 합니다.이 개념들이 혼동되지 않도록 다시 정리하고자 합니다.식별 관계와 비식별 관계식별 관계 (Identifying Relationship)식별 관계는 부모 테이블의 기본 키(Primary Key, PK)가 자식 테이블의 기본 키의 일부로 포함되는 관계이다.즉, 자식 테이블에서 부모 테이블의 기본 키가 자식 테이블의 기본 키에 포함되어, 두 테이블 간의 관계가 강하게 묶여 있다. 이 관계는 자식 테이블의 기본 키가 부모 테이블의 기본 키에 의존..