Spring

잔디심는 정원사
[JPA] MultipleBagFetchException와 N+1문제 동시에 해결하기
·Spring/JPA
안녕하세요! 오늘은 JPA를 사용하다보면 한 번쯤 만나게 되는 에러인 N+1문제와 MultipleBagFetchException문제를 해결하는 방법에 대해 공유하고자 합니다. 🥲 문제 상황 제 프로젝트에서 한 엔티티가 2개의 연관된 엔티티를 List 타입으로 가지고 있었습니다. 그리고 게시글 전체를 조회할 때 JobPost의 WorkDay(요일)와 Job(하는 일)은 모두 보여줘야 했습니다. { "data": { "numOfPost": 0, "posts": [ { "jobPostId": null, "title": "string", "storeName": "string", "latitude": 0.0, "longitude": 0.0, "salary": 0, "salaryType": "연봉", "curren..
[Spring Boot] FCM을 이용해 Android 앱에 Push 알림 보내기
·Spring
Firebase Cloud Messaging(FCM)은 백엔드 서비스나 서버간 통신을 위한 메시지 전달을 위해 Firebase에서 제공하는 무료 메시징 솔루션입니다. 이 글에서는 Spring Boot를 이용해서 FCM을 사용해 Android 앱에 푸시 알림을 보내는 방법에 대해 다루겠습니다. 왜 FCM을 사용했을까? 서버에서 어떤 데이터를 앱에 전달하려면 네트워크 연결은 필수입니다. 앱은 서버에서 데이터가 언제 송신될지 모르기 때문에 서비스 컴포넌트로 네트워크에 항상 연결되어 있어야 하는 것입니다. 문제는 백그라운드 제약 때문에 앱이 포그라운드 상황이 아니라면 서버와 연결을 지속할 수 없다는 것입니다. 하지만 클라우드 메시징은 서버의 데이터를 앱에 직접 전달하지 않고 FCM 서버를 거쳐서 앱에 전달하는 ..
[Redis] Redis와 Refresh Token을 이용해서 토큰 재발급 하기
·Spring/Redis
- 빠른 성능: 인메모리 기반인 Redis는 빠른 응답 속도를 제공합니다. - 유연한 데이터 만료 관리: Redis는 각 키에 대해 만료 시간을 설정할 수 있어, Refresh Token의 유효기간 관리가 용이합니다. - 내구성: Redis는 데이터를 디스크에도 저장할 수 있어 서버 재시작 시에도 데이터를 유지할 수 있습니다. 이러한 이유 때문에 Redis를 이용해서 토큰을 재발급받았습니다. 1️⃣ Access Token과 Refresh Token 발급 사용자가 성공적으로 로그인하면, JWT를 사용하여 사용자의 ID와 기타 정보를 포함한 Access Token과 Refresh Token을 발급합니다. Access Token은 짧은 유효 시간을 가지며, Refresh Token은 상대적으로 긴 유효 시간을..
[JWT] JWT 필터와 예외 처리
Spring Security에서 인증 메커니즘을 구현하기 위해 JWT 필터를 사용했습니다. 이 필터는 Exception Handler로 처리를 못하기 때문에 별도의 메커니즘이 필요합니다 ! 왜 그럴까? JWT 필터는 OncePerRequestFilter를 상속받아 매 요청마다 한 번씩 실행됩니다. 이 필터는 HTTP 요청 헤더에 포함된 JWT를 해석하고, 유효한 토큰인 경우 Security Context에 인증 정보를 설정합니다. 또한 이 필터는 Dispatcher Servlet 보다 앞단에 위치하여, Handler Interceptor는 뒷단에 존재하기 때문에, Filter에서 보낸 예외는 Exception Handler로 처리를 못합니다. 따라서, JWT 필터에서 예외가 발생할 경우 이를 적절히 처리..
[Spring] 소셜 로그인 구현하기- 카카오편
·Spring
카카오는 구글과 동일한 과정을 거칩니다. 1. 클라이언트 쪽에서 로그인을 합니다. 2. 카카오 서버는 redirect url로 code를 전달해줍니다. 3,4. code를 이용하여 access_token을 발급받습니다. 5. access_token을 서버로 전송합니다. —————————————————————————————————————— 6,7. 서버에서는 받은 access_token을 이용하여 카카오 서버에서 사용자 정보를 받습니다. 8. 받은 사용자 정보를 이용하여 회원가입 또는 로그인을 진행합니다. 9. JWT등과 같이 사용자 식별 정보를 클라이언트로 보냅니다. 1~5는 프론트엔드에서 구현할 것이고, 백엔드는 6~9만 구현하면 됩니당! 더보기 나는 백엔드이지만 테스트를 해야했고...그래서 실질적으로..
[Spring] 소셜 로그인 구현하기-구글 편(id-token 활용)
·Spring
구글 소셜 로그인을 구현하는 방법은 생각보다 여러가지이다. 첫 번째는 OAuth 2.0 를 활용해 백엔드에서 모두 처리(code 생성, 인증)하는 것과 id token (구글은 access token 이 아닌 id token이다) 를 프론트엔드에게 받아 이 id token 을 백엔드에서 인증하는 것이다. 나는 그 중에서 id token을 프론트엔드에서 받아와 백엔드에서 인증하는 방식을 설명하고자 한다. 전체적인 순서는 다음과 같다. 1. 클라이언트가 구글에게 로그인 요청을 보낸다. 2. 로그인에 성공하면 구글은 유저의 ID 토큰을 클라이언트에게 넘겨준다. 3. 클라이언트는 서버에 ID 토큰과 함께 로그인 요청을 보낸다. 4. 서버에서는 구글의 토큰 검증 API에 요청을 보내 ID 토큰의 무결성을 검증한다..
Redis를 이용해 현재 로그인 중인 사용자 확인하기
·Spring/Redis
0. Redis 설치 [EC2+Docker] ✔️redis 이미지 다운 docker pull redis ✔️이미지 파일 확인 docker images ✔️ AWS 보안그룹 인바운드/아웃바인드 설정 ✔️ docker를 사용하여 redis 이미지를 만들고 redis 비밀번호를 설정 docker run -p 6379:6379 --name (redis 컨테이너 이름) -d redis:latest --requirepass "(비밀번호)" ex) docker run -p 6379:6379 --name spring-redis -d redis:latest --requirepass "123456" ✔️ redis-cli에서 인증 후 접속 확인 docker exec -i -t (redis 컨테이너 이름) redis-cli..
[spring security] 시큐리티 & JWT 이용해서 로그인, 회원가입하기 - (2) 로그인
지난 시간에 회원가입까지 진행했다면 이제 회원가입한 계정으로 로그인을 진행하도록 한다. JWT는 유저를 인증하고 식별하기 위한 토큰기반 인증이다. 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다. JWT 가 가지는 핵심적인 특징이 있다면, 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다는 것이다. 더 자세하게 알고 싶다면 아래의 벨로그가 도움이 될 것이다. 🤔 JWT, 정확하게 무엇이고 왜 쓰이는 걸까? Json Web Token에 대해서 정확히 알고 넘어가자. velog.io JWT+ Spring Security 전체적인 동작 과정 Refresh Token? Access Token을 발급하기 ..
[spring security] 시큐리티 & JWT 이용해서 로그인, 회원가입하기 - (1) 회원가입
회원가입이 로그인보다 간단하므로 회원가입부터 구현한다. 이메일과 비밀번호를 입력받아 회원가입을 진행한다. 이때, 비밀번호를 db에 저장할 때 암호화해서 저장해야 한다. 그리고, 이미 존재하는 회원이면 에러코드를 출력한다. 1. 의존성 추가 build.gradle implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'io.jsonwebtoken:jjwt-api:0.11.5' implementation 'io.jsonwebtoken:jjwt-impl:0.11.5' implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5' 2. SecurityConfig.java 작성 @C..
[JPA] entity에서 생성시간, 수정시간 반영하는 법
·Spring/JPA
생성할 때의 시간과 수정할 때의 시간을 저장하는 방법에는 뭐가 있을까? 가장 직관적인 방법은 생성할 때와 수정할 때마다 LocalDateTime.now()를 호출해서 직접 setter로 값을 넣어주는 방법이다. 하지만 매번 이런 작업을 하는 것은 여간 귀찮은 일이 아니다. 그래서 보통은 @CreatedDate와 @LastModifiedDate를 사용한다. CreatedDate : Entity가 생성되어 저장될 때 시간이 자동으로 저장 LastModifiedDate : 조회한 Entity의 값을 변경할 때 시간이 자동으로 저장 내가 사용하는 Entity에 직접 이 어노테이션을 붙이지 말고, 생성시간과 수정시간만 따로 BaseTimeEntity에 저장해 이 entity를 상속하도록 한다. BaseTimeEn..
minsu20
'Spring' 카테고리의 글 목록