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

Development

(155)
[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-..
[TIL] DTO, Entity에서 Wrapper 클래스를 사용하는 이유 직렬화 및 역직렬화Primitive 타입의 한계: Java의 기본형(primitive type)은 null 값을 가질 수 없다. 예를 들어, int, long, boolean 같은 타입은 null이 될 수 없으므로, 직렬화 시 null을 표현해야 할 경우 문제가 발생할 수 있다.Wrapper 클래스의 유연성: 기본형에 대응하는 Wrapper 클래스(Integer, Long, Boolean 등)를 사용하면, null 값도 가질 수 있기 때문에 직렬화/역직렬화 과정에서 발생할 수 있는 문제를 방지할 수 있다. 이는 데이터베이스에서의 NULL 값을 표현하거나, JSON 직렬화 시 값이 없음을 표현할 때 유용하다.DTO와 Entity의 설계DTO의 표현 유연성: DTO는 주로 데이터 전송을 위한 객체로, 클라이..
[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..