목록Spring (38)
Hansel

REGEX 정규표현식이란? 제시된 문자열을 바탕으로 정해진 패턴과 일치하는지 검사하는 문자열 처리 방법입니다. 저는 회원가입 기능에 이메일 입력 검증을 위한 정규표현식을 사용했지만 제가 사용한 정규표현식을 명확히 설명하지 못했습니다. 명확히 알고 사용하고자 해당 글을 작성합니다. 이걸 어떻게 해석하지? 저는 (알파벳+숫자 조합의 문자열)@(알파벳).(알파벳) 형식의 이메일만 통과되도록 하기 위해 정규표현식을 사용했습니다. 아래는 제가 사용한 정규표현식입니다. "( [!#-'*+/-9=?A-Z^-~-]" + "+(\.[!#-'*+/-9=?A-Z^-~-]+)" + "*|\"\(\[\]!#-[^-~ \t]|(\\[\t -~]))+\")" + "@([!#-'*+/-9=?A-Z^-~-]" + "+(\.[!#-'*..

@Async 비동기 문제 1. 임시 비밀번호를 비동기로 전송하도록 설정했지만 계속 동기로 전송되었다. 2. 임시 비밀번호 전송을 비동기로 처리했지만, 예외가 발생했을 경우 동일 스레드에서 잡아 처리하지 못한다. 사진과 같이 catch를 통한 예외처리가 되지 않고 메세지 전송 실패 체크 예외가 터진다. 지금은 이메일 전송하는 로직이 임시 비밀번호 밖에 없지만 다수의 비동기 전송 메서드가 존재할 경우 어떤 메서드에서 예외가 났는지, 어떤 메일에 보내려다 실패했는지 정확히 파악하기가 어렵다. 해결 1번 문제의 경우 스프링 AOP와 관련이 있었습니다. 우선 @Async를 통한 비동기 처리를 하기 위해서는 두가지 조건을 만족해야 합니다. 1. 접근 제한자가 public 이어야 한다. 2. 동일 클래스 내에서 호출..

프로젝션 프로젝션은 데이터베이스의 관계대수에 나오는 개념이다. 실렉션은 수평적이고 프로젝션은 수직적이다. 다시말해 애트리뷰트의 부분 집합을 반환한다. 하나의 엔티티에서 프로젝션을 하더라도 다양한 타입의 결과가 반환될 수 있다. 사용법은 단순히 select절에 원하는 애트리뷰트를 기입하면 된다. 현재는 username만 가져오기 때문에 String만 반환하지만 만약 타입이 다른 다양한 값이 추가된다면, 그땐 튜플로 반환하게 된다. 튜플은 쿼리Dsl에서 사용하는 클래스로 이전에 언급했다. 2개 이상의 애트리뷰트를 프로젝션 연산하니 Tuple로 반환한다. DTO 반환하기 쿼리DSl 이전에는 DTO를 생성하기 위해 데이터의 집합을 가져와 내부 stream을 돌리거나, new 오퍼레이션을 사용해 DTO를 반환했다..

조인 SQL에서 가장 중요한 개념 중 하나이다. select와 from을 명시하는 것은 동일하고 그 후에 join 메서드를 사용해 조인한다. 조인 대상이 되는 테이블의 연관 엔티티와 연관 엔티티를 파라미터로 보내면 된다. On 절을 이용한 조인도 같은 방식으로 사용할 수 있다. 연관관계가 없는 조인 위에 연관관계가 있는 조인과의 차이점은 join 메서드 파라미터에 하나의 인자만 들어간다는 점이다. join()파라미터 안에 두 엔티티가 들어가는 것은 pk, fk를 기준으로 조인하는 것이다. 하지만 연관관계가 없는 엔티티는 pk, fk 매핑이 안되어 있으니 하나의 엔티티만 들어간다. 페치조인 JPA의 꽃 페치조인이다. 조인 방법은 동일하며, 조인 메서드 이후에 .fetchJoin 메서드를 추가해 사용한다. ..

Jpql과의 차이 작성하는 쿼리 자체는 매우 유사하다. 조건식의 경우 스프링 데이터 JPA의 쿼리메서드 작성 방식과 유사하다는 느낌이 들었다. Q클래스 사용 첫 라인과 같이 직접 변수로 선언하여 사용하거나, 두번째 라인과 같이 정적 변수를 사용하는 방법이 있다. 첫번째 방법과 같이 alias를 사용하는 방식은 셀프조인이 필요한 경우 사용된다. 조건절 http://querydsl.com/static/querydsl/4.1.0/apidocs/com/querydsl/core/types/dsl/Expressions.html Expressions (Querydsl 4.1.0 API) querydsl.com 위 링크에서 레퍼런스를 참고할 수 있다. 조건절에 사용되는 메서드는 NumberExperssion, Bool..

이전에 프로젝트를 진행하다 동적 쿼리를 유연하게 처리하지 못해 각 상황에 맞는 쿼리를 작성하여 처리한 경험이 있었다. 해당 문제를 해결하고 비슷한 문제를 겪지 않도록 Querydsl을 학습하려 한다. 추가 추가하는 방법은 간단하다. Gradle 기준으로 Build.gradle에 의존성을 추가해주면 된다. implementation 'com.querydsl:querydsl-jpa' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annot..

일반적으로 트랜잭션 적용이 필요한 메서드 및 클래스에는 위와 같이 @Transactional 애노테이션을 붙여 사용했다. 데이터베이스에서 트랜잭션이 무엇을 의미하는지는 알았지만 저 애노테이션이 어떤 역할을 하는지 왜 필요한지에 대해서는 잘 알지 못했다. 위와 같은 애노테이션을 선언적 트랜잭션 관리 방법이라 한다. 선언적 트랜잭션 관리(Declarative Transaction Management) 간단히 @Transactional을 추가해 매우 편리하게 트랜잭션을 적용하는 것을 선언적 트랜잭션 관리라 한다. 이름 그대로 해당 로직에 트랜잭션을 적용하겠다 라고 어딘가에 선언하기만 하면 트랜잭션이 적용되는 방식이다. 이게 어떤 식으로 동작하는지는 스프링 AOP를 학습해야하는데 아직은 학습하지 않았기 때문에 ..

이전에 썼던 동작 방식을 보면 순서는 다음과 같았다. 필터가 인증 요청을 가로챈다. Authentication은 자격 정보를 받고 AuthenticationManager에게 전달한다. manager는 적합한 provider를 찾고(supports) 그 provider의 authenticate 메서드를 호출한다. 그 후 userDetailsService에 유저 자격 정보로 검증을 한다(loadByUserName()). 검증이 완료 되면 Principal(UserDetail)을 반환한다. 그 Principal을 이용하여 Authentication 타입의 객체를 생성하고 그 객체를 가지고 세션을 생성한다. 이 과정을 코드로 살펴보자. 우선 기본적으로 디펜던시를 설정해줘야 한다. 필터 등록하기 WebSecuri..

스프링 시큐리티는 어떻게 적용할까? 스프링 시큐리티는 특정 라이브러리를 추가하거나 Api를 호출하는 것이 아니다. Spring Security Starter Dependency를 추가만 해주면 스프링 시큐리티가 알아서 모든 요청들에 대한 Intercepting을 하기 시작한다. 이 작업은 Filter를 통해 이루어진다. Filter 필터는 단순한 서블릿 애플리케이션의 클래스인데 이 필터는 요청들을 인터셉트 할 수 있도록 해준다. 필터의 정의는 다음과 같다. Servlet Filters are Java classes that can be used in Servlet Programming for the following purposes − To intercept requests from a client be..

https://youtu.be/I0poT4UxFxE 현재 하는 프로젝트는 하다 단순 세션을 이용한 로그인을 지원하는데 이런 간단한 방식 보다는 스프링에서 지원해주는 더 좋은 기능을 최대한 활용해보고자 스프링 시큐리티를 적용하기로 했다. 어떤 기능을 사용하고 확장하기 위해서는 그 구조를 잘 알아야한다. 우선 스프링 시큐리티와 관련된 중요 단어를 먼저 정리하자. Authentication = Prove who you are 일반적인 웹사이트는 단순히 보기만 하는 것은 로그인을 필요로 하지 않지만 글을 쓰거나 특정한 무언가를 하려면 로그인을 해야한다. 그 로그인을 통해 내가 누구인지 증명하는 과정이 Authentication 이라고 할 수 있다. Authorization = Can this user do th..