Backend

Backend/Redis

Spring Data Redis TTL 이슈

Redis TTL 이슈 레디스의 학습 테스트를 진행 하던 중 TTL 설정 시 발생하는 이슈를 확인 할 수 있었다. 다음과 같은 도메인이 있다. @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @RedisHash(value = "fruits", timeToLive = 1) public class Fruits { @Id private String id; private String name; private Integer stock; @Indexed private LocalDateTime createdAt; @Builder private Fruits(String name, Integer stock, LocalDateTime createTime) { thi..

Backend/Spring

Spring Security 5 -> Spring Security 6 에서의 Session 변경점

서론 Spring Security를 Security 5로 공부를 진행해나가면서 Security6 에서 많은 부분이 변경되었다는 얘기를 듣고 공식문서를 보면서 학습한 내용에 대해 Security5를 Secuirty6로 Migration을 진행 해 나갔습니다. 그 중에서 SecurityFilterChain에 등록을 할 때 정적 자원들에 대해서 ignoring 설정을 해주지 않으면, SecurityFilterChain에서 이전에 등록되어있는 정적 자원들에 대해 모든 Filter들이 적용이 되기에 쓸데없는 메모리 낭비가 발생하고, ignoring설정을 해서 새로운 SecurityFilterChain을 만들어 주되 Filter 들은 추가되지 않는 방향으로 성능 개선을 진행한 사례를 볼 수 있었습니다. 이에 대해,..

Backend/Spring

Spring Security OAuth2 주요 용어와 인증 방식

OAuth2(Open Authenticaiton, Open Authorization) 표준 인증 프로토콜이다. 사람들은 타 사이트의 비밀번호를 제 3의 서버에서 노출하기를 꺼린다. → 노출되며 다른 정보도 노출 될 것이 자명하기 때문. 사용자가 타 사이트의 비밀번호를 변경하게 되면 제 3의 서버에 저장된 비밀번호도 바꿔야 해서 정상적인 서비스가 불가능하다. 주요 용어 Resource Owner : 서비스를 이용하는 사용자, 즉 리소스 보유자 Client : Resource Server에 자원을 요청하는 제 3 서버, RO를 대신하여 리소스를 요청한다. Resource Server : 클라이언트의 요청을 수락하고 응답할 수 있는 서버, ex) 네이버, 카카오 등 Authorization Server : 성..

Backend/JPA

Spring Data JPA는 왜 @Repository를 사용하지 않아도 될까?

Spring Data 스프링 데이터 JPA를 알기전에 먼저 스프링 데이터부터 알아봐야 한다. 사실 스프링 데이터 JPA는 JPA에 특화 된 스프링 데이터 프로젝트의 하나이다. 실제로는 스프링 데이터 Redis, 스프링 데이터 Mongo 등등 다양한 스프링데이터들이 존재한다. 이러한 것들을 인터페이스화 하여, 공통 기능으로 간단한 쿼리를 생성해주는 것이 Spring Data이다. Spring Data JPA 스프링 데이터에는 여러가지 메서드들이 있고, JPA에 특화된 스프링 데이터 JPA 계층구조를 잠시 살펴보자. 다음과 같은 구조를 하고 있다. 그런데 이상한 점은 스프링 데이터 JPA를 만들게 되면 우리는 빈으로 등록하지 않았음에도 불구하고, 스프링 데이터 JPA의 인터페이스가 빈으로 등록되어 있고, 그..

Backend/Spring

Invalid character found in method name 에러

Postman을 사용하여 스프링의 @ResponseBody로 api 통신을 하고 있던 와중에 다음과 같은 오류를 겪게 되었다. Error parsing HTTP request header Invalid character found in method name HTTP method names must be tokens 대충 에러를 보면 HTTP 요청헤더에 뭔가 잘못되었다고 하고 HTTP 메서드 이름에서 유효하지 않은 문자가 발견됐다는 것이다. 그리고 토큰화 되어야 한다고 한다. 먼저 헤더부터 살펴봤다. Content-type도 application/json으로 일치하고, Accept는 따로 설정하지 않았으니까 별 문제가 없을 것이고 Connection 또한 tcp 연결을 time-out 만큼 유지하고, ma..

Backend/JPA

JPA 상속관계 매핑

오늘은 JPA의 상속관계 매핑에 대해서 포스팅해보고자 한다. 이전 프로젝트를 진행하면서 상속관계 매핑을 고려하지 않고 엔티티를 구성하여, 많은 부분에서 고생을 한 경험이 있었다ㅠㅠ... 하나 하나 알아가보자. 상속 관계에 대한 데이터베이스와 객체의 패러다임 불 일치 우선 상속이라는 것은 객체에는 존재하지만, 관계형 데이터베이스에는 존재하지 않는다. 이 존재하지 않는다는 것은 물리적으로 존재하지 않는다는 것이다. 하지만, 논리적인 데이터 모델링을 통해서 물리적으로 가능하게끔 만드는 방법은 존재한다. 그 방식이 슈퍼타입, 서브타입 방식이다. 이러한 논리 모델을 물리 모델로 변환하는 세 가지 기법이 있고, 해당 기법들을 JPA가 지원을 해준다. 조인 전략 : 부모 기본 키를 받아 테이블을 생성 (Inherit..

Backend/JPA

JPA 연관관계 매핑의 다중성

JPA에서 가장 중요한 것 두 가지를 꼽으라고 하면, 첫 번째는 영속성 컨텍스트 두 번째는 연관 관계 매핑이다. 어떤 비즈니스 로직이냐에 따라서 적절한 관계를 정해야 하기 때문에 굉장히 중요하다. 다중성을 알아보기 전에 알아봐야 할 용어가 몇 가지 있다. 다중성 : 다대일, 일대다, 일대일, 다대다 방향성 : 단방향, 양방향이 있다. 테이블에는 존재하지 않는다. 연관관계의 주인 : 양방향에서 연관 관계에 대해 관리하는 주체 즉, 읽기전용이 아닌 쪽을 말한다. 그 전에 짚고 넘어가야 할 부분이 있다. 이 부분은 자주 헷갈릴 수 있는 부분인데, 관계를 파악하기 위한 내 개인적인 방법이다. 연관관계 파악하기 때때로 지금 내가 파악하고자 하는 관계가 다대다 관계인지 다대일 관계인지 헷갈리는 경우가 종종 있다. ..

Backend/Spring

Spring AOP

Aspect의 등장 이유 스프링 AOP는 부가 기능 추가시 횡단 관심사로 인한 문제 때문에 등장하게 되었다. 만약 횡단 관심사를 객체 지향적으로 해결하기 위해서는 많은 문제들이 발생한다. 부가 기능을 적용할 때, 부가 기능을 적용하기 위한 코드를 작성해주어야 한다.(템플릿 적용 전) 부가 기능이 여러곳에 퍼져서 중복 코드를 만들어 낸다. (적용 이후에도 동일) 부가기능 변경 시 많은 부분을 수정해야 한다. (제대로 된 캡슐화가 되지 않음) 부가기능 적용대상 변경 시 많은 수정이 필요하다. (적용하지 않을 대상들을 직접 찾아야 함.) 이러한 문제점을 해결하기 위해 핵심 로직과 부가 기능 로직을 나누고, 부가 기능을 어디에 적용하고 어떤 부가 기능을 적용할 지 선택하는 기능을 합한 하나의 모듈로서 등장한 것..