'분류 전체보기' 카테고리의 글 목록 (6 Page)
본문 바로가기

분류 전체보기

(243)
[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)가 자식 테이블의 기본 키의 일부로 포함되는 관계이다.즉, 자식 테이블에서 부모 테이블의 기본 키가 자식 테이블의 기본 키에 포함되어, 두 테이블 간의 관계가 강하게 묶여 있다. 이 관계는 자식 테이블의 기본 키가 부모 테이블의 기본 키에 의존..
[Diary] @SpringBootApplication의 @ComponentScan 범위 문제 상황JwtUtil 클래스를 Bean에 등록했음에도, autowire을 할 수 없다는 경고가 자꾸 나온다.문제 원인: Component Scanning 범위원인이 무엇인지 갈피를 못 잡아서 GPT한테 물어보니, "Component Scanning이 이루어지는 패키지 안에 있음?"이라고 한다.경로를 다시 보니 개발이 이루어지는 domain과 global 디렉토리가 @SpringBootApplication 이 있는 패키지 밖에 있었다.문제 해결해결은 위 두 디렉토리를 패키지 안으로 넣어서 해결했긴 한데, 이 @SpringBootApplication의 Component Scan 범위에 대해 알게 되었다.기본적으로 Component Scan이 이루어지는 범위는 @SpringBootApplication이 적용..
[Diary][Spring] Spring Cloud Gateway와 FeignClient를 같이 사용하면 발생할 수 있는 문제 Spring Cloud Gateway는 비동기 방식의 요청 처리를 지원하는 API Gateway 입니다. 하지만 이와 같은 비동기 환경에서 동기식 HTTP 클라이언트를 사용할 경우 성능 저하나 예상치 못한 문제가 발생할 수 있습니다. 이번 글에서는 Spring Cloud Gateway에서 FeignClient를 사용할 때 발생할 수 있는 문제와 그 해결 방법에 대해 다루어 보겠습니다.문제 상황@Componentpublic class CheckUserRegisterFilter implements GlobalFilter { @Value("${service.jwt.secret-key}") private String secretKey; private final AuthClient authClie..
[TIL] Kafka와 RabbitMq의 철학, 그리고 어떻게 철학을 달성했을까? * ChatGPT 4o가 작성한 답변입니다.철학Apache Kafka: 분산 스트리밍 플랫폼철학: Kafka는 확장성, 내결함성, 높은 처리량을 중시하는 분산 스트리밍 플랫폼으로 설계되었습니다. 이벤트 스트림이라는 개념을 중심으로 구축되어, 데이터를 실시간 또는 거의 실시간으로 지속적으로 수집하고 처리하는 데 초점을 맞추고 있습니다.사용 사례: Kafka는 데이터 파이프라인 구축, 스트림 처리 애플리케이션, 실시간 분석 시스템 구축에 자주 사용됩니다. 대규모 데이터를 분산 환경에서 효율적으로 처리하는 데 뛰어납니다.RabbitMQ: 메시지 브로커철학: RabbitMQ는 신뢰할 수 있는 메시지 전달, 복잡한 라우팅, 메시지 큐잉에 중점을 둔 전통적인 메시지 브로커입니다. Advanced Message Qu..
[TIL] Redis 캐싱을 사용해야 할 때 주의해야 하는 점 Redis 캐싱의 문제 발생 시나리오불필요한 데이터의 캐싱: 예를 들어 Redis에 50GB의 데이터가 저장되어 있는 상황에서, 페이지네이션(paging) 데이터를 캐싱하는 과정에서 불필요한 데이터를 과도하게 캐싱한 경우가 있을 수 있다. 이는 Redis 메모리를 불필요하게 차지하여 효율성을 저하시키고, 결국 Redis 장애로 이어질 수 있다.Redis 장애: 불필요한 데이터가 캐시에 쌓이면서 Redis 메모리가 고갈되고, 이로 인해 Redis가 정상적으로 작동하지 못하게 된다. 결과적으로 Redis에 연결하려는 요청들이 타임아웃(timeout)을 유발하게 되며, 시스템 성능에 심각한 영향을 미친다.문제 발생 시 해결 방법타임아웃 설정: Redis와의 연결 시 타임아웃 설정은 필수적이다. 예를 들어, 타..
[Database] CQRS와 분산 읽기/쓰기 DB 구성, 데이터 일관성 모델 (최종 일관성, 강력한 일관성) CQRS (Command and Query Responsibility Segregation)CQRS는 명령(Command)과 조회(Query) 작업의 책임을 분리하는 패턴이다. 이 패턴의 핵심 아이디어는 다음과 같다.명령(Command): 데이터의 상태를 변경하는 작업을 담당한다. 예를 들어, 데이터베이스에 새로운 데이터를 삽입하거나 기존 데이터를 수정하는 작업이다.조회(Query): 데이터를 읽는 작업을 담당한다. 데이터베이스에서 데이터를 조회하여 사용자에게 제공하는 역할을 한다.이 패턴에서 명령과 조회는 서로 다른 모델로 구현될 수 있으며, 심지어 서로 다른 데이터 저장소를 사용할 수도 있다.기존 데이터베이스 모델의 문제점데이터베이스의 쿼리와 업데이트에 동일한 데이터 모델을 사용하는 경우, 아래와 같..
[Spring] @Builder사용할 때 @AllArgsConstructor를 적용하면 왜 @NoArgsConstructor와 함께 쓰이지 못하는가? 문득 @Builder를 사용하면서 intelliJ가 시키는 대로 @NoArgsConstructor, @AllArgsConstructor를 추가했는데요이게 왜 필요할까 궁금해져서 @Builder에 대해 알아보았습니다.@Builder* If a member is annotated, it must be either a constructor or a method. If a class is annotated,* then a package-private constructor is generated with all fields as arguments* (as if {@code @AllArgsConstructor(access = AccessLevel.PACKAGE)} is present* on the class), a..